فهم استدعاءات النظام (System Calls): استخدام strace و ltrace لتتبع سلوك البرامج


فهم استدعاءات النظام (System Calls): استخدام strace و ltrace لتتبع سلوك البرامج

يا هلا بالمهندسين! اليوم بنغوص شوي في قلب نظام Linux عشان نفهم كيف البرامج تتفاعل مع النواة. البرامج اللي نشغلها ما تقدر تسوي كل شيء بنفسها، تحتاج تطلب خدمات من النواة. هالطلبات هي "استدعاءات النظام" (System Calls).

تخيل برنامجك يبي يفتح ملف، يقرأ منه، يكتب فيه، أو حتى يسوي عملية جديدة. كل هذي طلبات للنواة. اليوم بنستخدم أداتين رهيبتين: strace و ltrace عشان نشوف هالاستدعاءات مباشرة.

strace: تتبع استدعاءات النظام

strace أداة قوية جداً، تخليك تشوف بالضبط وش استدعاءات النظام اللي يسويها أي برنامج. تخيل إنك دكتور وتبي تشوف وش يسوي المريض (البرنامج) داخلياً. strace هو جهاز الأشعة السينية حقك.

كيف تستخدمه؟

  • بكل بساطة، اكتب strace قبل الأمر اللي تبي تراقبه.
  • مثال:
strace ls

بتشوف كمية هائلة من المخرجات! كل سطر يمثل استدعاء نظام.

فهم المخرجات:

  • كل سطر يبدأ باسم استدعاء النظام (مثل execve, open, read, write, close).
  • بعدها الأقواس فيها الوسائط (arguments) اللي تمررت للاستدعاء.
  • بعدها = يجي قيمة الإرجاع (return value). عادةً 0 يعني نجاح، -1 يعني فشل (مع errno يوضح السبب).

مثال عملي:

شغل الأمر التالي وشوف كيف cat يفتح ويقرأ ويكتب:

strace cat /etc/passwd

بنلاحظ استدعاءات مثل open لفتح الملف، read لقراءته، write لكتابة المحتوى على الشاشة، و close لإغلاق الملف.

فلترة المخرجات:

المخرجات كثيرة، كيف نفلترها؟

  • لتتبع استدعاءات محددة: strace -e open,read ls
  • لتتبع عملية شغالة بالفعل (معرفة الـ PID): strace -p <PID>
  • للحصول على ملخص إحصائي عن الاستدعاءات: strace -c ls

ملاحظة: strace مفيد جداً في تصحيح الأخطاء (debugging) وفهم سلوك البرامج الغامض. إذا برنامجك يعلق أو يعطي خطأ غريب، strace ممكن يكشف لك وين المشكلة.

ltrace: تتبع استدعاءات المكتبات (Library Calls)

طيب، strace يوريك استدعاءات النظام. لكن البرامج ما تتصل بالنواة مباشرة لكل شيء. معظم البرامج تستخدم مكتبات (مثل glibc) اللي بدورها تستدعي استدعاءات النظام. ltrace أداة شبيهة بـ strace لكنها تركز على تتبع استدعاءات المكتبات الديناميكية (Dynamic Library Calls).

ليش نحتاج ltrace؟

  • أحياناً المشكلة تكون في كيفية استخدام البرنامج لدوال المكتبة، مو في استدعاءات النظام نفسها.
  • مثال: دالة printf() في C هي دالة مكتبية، ما هي استدعاء نظام مباشر. ltrace يوريك متى يتم استدعاؤها وبأي وسائط.

كيف تستخدمه؟

  • نفس طريقة strace: اكتب ltrace قبل الأمر.
  • مثال:
ltrace ls

قارن المخرجات بـ strace ls. بتشوف فرق كبير! ltrace بيوريك دوال مثل strcpy, strlen, malloc, free, printf وغيرها.

مثال بسيط:

لنفرض عندنا برنامج C بسيط:

#include <stdio.h>
#include <string.h>

int main() {
    char buffer[20];
    strcpy(buffer, "Hello, ltrace!");
    printf("%s\n", buffer);
    return 0;
}

بعد تجميعه (مثلاً gcc -o myprog myprog.c)، شغل:

ltrace ./myprog

بتشوف استدعاءات لدوال مثل strcpy و printf.

ملاحظة: ltrace مفيد جداً لتصحيح أخطاء الذاكرة، أو فهم كيف يتعامل البرنامج مع السلاسل النصية والبيانات المعقدة قبل ما توصل للنواة.

متى تستخدم هذا ومتى تستخدم ذاك؟

  • strace:
    • إذا تبي تعرف البرنامج وش يسوي مع النواة (يفتح ملفات؟ يسوي عمليات جديدة؟ يرسل بيانات عبر الشبكة؟).
    • إذا عندك مشاكل في الصلاحيات، أخطاء I/O، أو تعليق البرنامج.
  • ltrace:
    • إذا تبي تعرف كيف البرنامج يستخدم دوال المكتبات (معالجة السلاسل، إدارة الذاكرة، عمليات رياضية).
    • إذا تبي تشوف القيم اللي تمرر لدوال المكتبة أو اللي ترجع منها.

الخلاصة

strace و ltrace أدوات قوية جداً في ترسانة أي مهندس أنظمة Linux. بتساعدك تفهم سلوك البرامج بشكل أعمق، وتكتشف المشاكل اللي ممكن تكون خفية. لا تتردد في استخدامها، خصوصاً لما تواجه سلوك غريب من أي برنامج.