كيفية استخدام strace لمراقبة مكالمات نظام Linux

نشرت: 2022-01-29
نافذة طرفية منمقة على جهاز كمبيوتر محمول.
fatmawati achmad zaenuri / Shutterstock.com

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

مكالمات النظام و Kernel

بقدر ما تكون ذكية ، لا تستطيع برامج الكمبيوتر أن تفعل كل شيء لنفسها. إنهم بحاجة إلى تقديم طلبات لأداء وظائف معينة لهم. تذهب هذه الطلبات إلى Linux kernel. عادة ، هناك مكتبة أو واجهة برمجية أخرى يستدعيها البرنامج ، ثم تقدم المكتبة الطلب المناسب - يسمى استدعاء النظام - إلى النواة.

يمكن أن تساعدك القدرة على رؤية مكالمات النظام التي قام بها البرنامج وما هي الردود على فهم الأعمال الداخلية للبرامج التي تهمك أو التي كتبتها. هذا ما تفعله strace . يمكن أن يساعد في استكشاف المشكلات وإصلاحها والبحث عن الاختناقات.

هذا ليس مثل تصحيح أخطاء تطبيق باستخدام أداة مثل gdb . يتيح لك برنامج تصحيح الأخطاء التحقيق في العملية الداخلية للبرنامج أثناء تشغيله. يتيح لك التنقل عبر منطق برنامجك وفحص الذاكرة والقيم المتغيرة. بالمقارنة ، ما يفعله strace هو التقاط معلومات استدعاء النظام أثناء تشغيل البرنامج. عندما ينتهي البرنامج المتعقب ، يسرد strace معلومات استدعاء النظام إلى نافذة المحطة الطرفية.

توفر مكالمات النظام جميع أنواع الوظائف منخفضة المستوى ، مثل إجراءات القراءة والكتابة على الملفات وعمليات القتل وما إلى ذلك. توجد قائمة بالمئات من استدعاءات النظام على صفحة دليل المكالمات.

ذات صلة: التصحيح باستخدام GDB: الشروع في العمل

تثبيت الدعامة

إذا لم يكن strace مثبتًا بالفعل على جهاز الكمبيوتر الخاص بك ، فيمكنك تثبيته بسهولة بالغة.

في Ubuntu ، استخدم هذا الأمر:

 sudo apt install strace 

في Fedora ، اكتب هذا الأمر:

 sudo dnf تثبيت الدعامة 

في Manjaro ، الأمر هو:

 sudo pacman -Sy strace 

الخطوات الأولى مع دعامة

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

 # تضمين <stdio.h>

int main (int argc، char argv []) { 

  // مقبض الملف 
  FILE * fileGeek ؛

  // افتح ملفًا يسمى "strace_demo.txt" ، أو قم بإنشائه 
  fileGeek = fopen ("strace_demo.txt"، "w") ؛

  // اكتب بعض النص إلى الملف 
  fprintf (fileGeek، "اكتب هذا إلى الملف") ؛

  // أغلق الملف 
  fclose (fileGeek) ؛

  // الخروج من البرنامج 
  عودة (0) ؛ 

} // نهاية main

لقد حفظنا هذا في ملف يسمى "file-io.c" وقمنا بتجميعه مع مجلس التعاون gcc في ملف قابل للتنفيذ يسمى stex ، سمي باسم " st Race ex ample."

 gcc -o stex file-io.c

سنقوم باستدعاء strace من سطر الأوامر وننقل اسم الملف التنفيذي الجديد الخاص بنا إليه باعتباره العملية التي نريد تتبعها. يمكننا بسهولة تتبع أي من أوامر Linux أو أي برنامج ثنائي آخر قابل للتنفيذ. نحن نستخدم برنامجنا الصغير لسببين.

السبب الأول هو أن strace مطولة. يمكن أن يكون هناك الكثير من الإخراج. هذا رائع عندما تستخدم strace في الغضب ، لكنها قد تكون ساحقة في البداية. هناك إنتاج محدود strace لبرنامجنا الصغير. السبب الثاني هو أن برنامجنا له وظائف محدودة ، وشفرة المصدر قصيرة ومباشرة. هذا يجعل من السهل تحديد أقسام الإخراج التي تشير إلى الأجزاء المختلفة من العمل الداخلي للبرنامج.

 strace ./stex 

يمكننا أن نرى بوضوح استدعاء نظام write الذي يرسل النص "اكتب هذا إلى الملف" إلى الملف المفتوح واستدعاء نظام exit_group . يؤدي هذا إلى إنهاء جميع مؤشرات الترابط في التطبيق وإرسال قيمة إرجاع مرة أخرى إلى shell.

تصفية الإخراج

حتى مع برنامج العرض التوضيحي البسيط لدينا ، هناك الكثير من المخرجات. يمكننا استخدام الخيار -e (التعبير). سنقوم بتمرير اسم استدعاء النظام الذي نريد رؤيته.

 strace -e الكتابة ./stex 

الإعلانات

يمكنك الإبلاغ عن مكالمات النظام المتعددة عن طريق إضافتها في شكل قائمة مفصولة بفواصل. لا تقم بتضمين أي مسافة بيضاء في قائمة مكالمات النظام.

 strace -e close ، اكتب ./stex 

إرسال الإخراج إلى ملف

فائدة تصفية الإخراج هي أيضًا مشكلة تصفية الإخراج. ترى ما طلبت رؤيته ، لكنك لا ترى أي شيء آخر. وقد تكون بعض هذه المخرجات الأخرى مفيدة لك أكثر من الأشياء التي طلبت رؤيتها.

في بعض الأحيان ، يكون من الأنسب التقاط كل شيء والبحث والتمرير عبر مجموعة النتائج بأكملها. بهذه الطريقة ، لن تستبعد عن طريق الخطأ أي شيء مهم. يتيح لك الخيار -o (الإخراج) إرسال الإخراج من جلسة strace إلى ملف نصي.

 strace -o trace-output.txt ./stex 

يمكنك بعد ذلك استخدام الأمر less للتمرير خلال القائمة والبحث عن مكالمات النظام - أو أي شيء آخر - بالاسم.

 أقل تتبع الإخراج. txt 

يمكنك الآن استخدام كل إمكانيات البحث less لاستقصاء المخرجات.

ذات صلة: كيفية استخدام أقل الأوامر على لينكس

إضافة الطوابع الزمنية

يمكنك إضافة عدة طوابع زمنية مختلفة إلى الإخراج. يضيف الخيار -r (الطوابع الزمنية النسبية) طوابع زمنية تُظهر فرق الوقت بين بداية كل مكالمة نظام متتالية. لاحظ أن قيم الوقت هذه ستتضمن الوقت المستغرق في مكالمة النظام السابقة وأي شيء آخر كان يفعله البرنامج قبل مكالمة النظام التالية.

 strace -r ./stex 

الإعلانات

يتم عرض الطوابع الزمنية في بداية كل سطر من الإخراج.

لمعرفة مقدار الوقت المستغرق في كل مكالمة نظام ، استخدم الخيار -T (مرات syscall). يوضح هذا المدة الزمنية المستغرقة داخل كل مكالمة نظام.

 strace -T ./stex 

يتم عرض المدد الزمنية في نهاية كل خط استدعاء للنظام.

لمعرفة الوقت الذي تم فيه استدعاء كل مكالمة نظام ، استخدم الخيار -tt (الطوابع الزمنية المطلقة). يعرض هذا وقت "ساعة الحائط" بدقة ميكرو ثانية.

 strace -tt ./stex 

يتم عرض الأوقات في بداية كل سطر.

تتبع عملية جارية

إذا كانت العملية التي تريد تتبعها قيد التشغيل بالفعل ، فلا يزال بإمكانك إرفاق strace بها. للقيام بذلك ، تحتاج إلى معرفة معرف العملية. يمكنك استخدام ps مع grep للعثور على هذا. لدينا Firefox قيد التشغيل. لمعرفة معرّف عملية firefox ، يمكننا استخدام ps وتوجيهه عبر grep .

 ps -e | grep Firefox 

الإعلانات

يمكننا أن نرى أن معرّف العملية هو 8483. سنستخدم الخيار -p (معرّف العملية) لنخبر strace عن العملية المراد إرفاقها. لاحظ أنك ستحتاج إلى استخدام sudo :

 سودو ستريس ص 8483 

سترى إشعارًا يفيد بأن strace قد ألحقت نفسها بالعملية ، وبعد ذلك سيتم عرض مكالمات تتبع النظام في نافذة المحطة الطرفية كالمعتاد.

إنشاء تقرير

يتسبب الخيار -c (الملخص فقط) في strace لطباعة تقرير. يقوم بإنشاء جدول للحصول على معلومات حول مكالمات النظام التي تم إجراؤها بواسطة البرنامج المتعقب.

 strace -c ./stex 

الأعمدة هي:

  • ٪ time : النسبة المئوية لوقت التنفيذ المنقضي في كل استدعاء للنظام.
  • الثواني : إجمالي الوقت المعبر عنه بالثواني والميكروثانية المنقضي في كل مكالمة نظام.
  • usecs / call : متوسط ​​الوقت بالميكروثانية الذي يقضيه في كل مكالمة نظام.
  • المكالمات : عدد المرات التي تم فيها تنفيذ كل مكالمة نظام.
  • الأخطاء : عدد حالات الفشل لكل استدعاء للنظام.
  • syscall : اسم استدعاء النظام.

ستعرض هذه القيم أصفارًا للبرامج التافهة التي يتم تنفيذها وتنتهي بسرعة. يتم عرض قيم العالم الحقيقي للبرامج التي تقوم بشيء أكثر وضوحًا من تطبيق العرض التوضيحي الخاص بنا.

رؤى عميقة ، بسهولة

يمكن أن يُظهر لك إخراج strace استدعاءات النظام التي يتم إجراؤها ، وأي منها يتم إجراؤها بشكل متكرر ، ومقدار وقت التنفيذ الذي يتم قضاؤه داخل كود جانب kernel. هذه معلومة عظيمة. في كثير من الأحيان ، عندما تحاول فهم ما يحدث داخل الكود الخاص بك ، فمن السهل أن تنسى أن نظامك الثنائي يتفاعل تقريبًا بلا توقف مع النواة لأداء العديد من وظائفها.

باستخدام strace ، ترى الصورة كاملة.

ذات صلة: أفضل أجهزة كمبيوتر Linux المحمولة للمطورين والمتحمسين