كيفية استخدام strace لمراقبة مكالمات نظام Linux
نشرت: 2022-01-29 تطلب برامج 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
، ترى الصورة كاملة.
أوامر لينكس | ||
الملفات | tar · pv · cat · tac · chmod · grep · diff _ _ _ _ _ _ _ _ _ _ _ · ذيل · ستات · ls · fstab · صدى · أقل · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · تثبيت · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · تحويل · rclone · shred · srm | |
العمليات | الاسم المستعار · شاشة · أعلى · لطيف · رينييس · تقدم · ستريس · systemd · tmux · chsh · تاريخ · في · دفعة · مجانية · أي · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · نعم · قتل · نوم · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg | |
الشبكات | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · حفر · إصبع · nmap · ftp · curl · wget · who · who · w · iptables · ssh-keygen · ufw |
ذات صلة: أفضل أجهزة كمبيوتر Linux المحمولة للمطورين والمتحمسين