الدرس 24: strace و ltrace — تتبّع System Calls
برنامج عالق أو بطيء أو يتصرّف بشكل غريب — من أين تبدأ التحقيق؟ strace هو المجهر الذي يستخدمه مهندسو Linux: فهو يعترض كل system call يجريه البرنامج ويعرضه في الوقت الحقيقي. ltrace يفعل الأمر نفسه مع library calls. في NVIDIA، عندما يتجمّد برنامج GPU، يكشف strace أيّ ioctl() هو محجوب عليه — إذ يستخدم ا
تخيّل أنك تتبع طفلاً وتسجّل كل فعل يقوم به: فتح الباب، أمسك الكوب، شرب الماء، أغلق الباب. هذا هو strace — فهو يدوّن كل 'فعل' يطلبه البرنامج من الـ kernel لتنفيذه. إذا وقف الطفل دقيقة كاملة أمام باب مغلق دون أن يتحرّك — فهذا بالضبط ما يعرضه strace: 'البرنامج محجوب على open() منذ دقيقة'.
- strace
- أداة Linux تعترض وتعرض كل system call يجريه البرنامج في الوقت الحقيقي. تستخدم syscall الخاص بالـ kernel وهو ptrace(). أساسية لتنقيح البرامج العالقة والانهيارات ومشكلات الصلاحيات.
- ltrace
- أداة شبيهة بـ strace لكنها تركّز على library calls (libc وlibm وما إلى ذلك) بدلاً من system calls المباشرة. تتيح لك رؤية استدعاءات مثل malloc() وprintf() وfopen() على مستوى المكتبة.
- system call
- الواجهة بين برامج user-space والـ kernel. كل عملية منظَّمة (قراءة ملف، إنشاء socket، تخصيص ذاكرة من نظام التشغيل) تمرّ عبر syscall. strace يعرضها جميعاً.
- ioctl
- syscall عام الغرض للتحكّم بالأجهزة (device control). يكشف الـ CUDA driver جميع عمليات GPU (تخصيص VRAM، إطلاق kernel، NVLink) عبر ioctl(). يُظهر strace على برنامج CUDA عشرات من ioctl calls.
- ptrace
- الـ syscall الذي بُني عليه strace. يتيح لعملية واحدة مراقبة عملية أخرى وإيقافها وفحصها. الـ debuggers مثل gdb تستخدم ptrace أيضاً.