תוכניות לינוקס לשאול את
גַרעִין
כדי לעשות כמה דברים עבורם. ה
סטריאו
הפקודה מגלה שיחות המערכת אלה. אתה יכול להשתמש בהם כדי להבין איך תוכניות עובדים ומדוע, לפעמים, הם לא.
שיחות הליבה והמערכת
חכם כמו שהם עלולים להיות, תוכנות מחשב לא יכולות לעשות הכל בעצמם. הם צריכים להגיש בקשות יש פונקציות מסוימות שבוצעו עבורם. בקשות אלה ללכת הקרנל לינוקס. בדרך כלל, יש ממשק תוכנת ספרייה או אחר כי שיחות התכנית, והספרייה אז מעבירים את הבקשה שנקראה מתאים מערכה קריאה הקרנל.
יכולת לראות את הקריאות במערכת כי תכנית עושה ומה היו התגובות יכולות לעזור לך להבין את המנגנון הפנימי של תוכניות שמעניינות אתכם או שהכתבת. זה
מה
סטריאו
עושה
. זה יכול לעזור בנושאים פתרון ולחפש צווארי בקבוק.
זה לא אותו הדבר כמו
באגים יישום
עם כלי כמו
gdb
. תכנית באגים מאפשרת לך לחקור את הניתוח הפנימי של תכנית כפי שהוא פועל. הוא מאפשר לך לדרוך דרך ההיגיון של התוכנית שלך ולבדוק וזיכרון וערכים משתנים. לשם השוואה, מה
סטריאו
עושה זה ללכוד את מידע קריאת מערכת כתכנית פועל. כאשר התוכנית מסתיימת לייחס,
סטריאו
מפרטת את המידע קריאת המערכת לחלון הטרמינל.
שיחות מערכת לספק כל מיני פונקציונליות ברמה נמוכה, כגון פעולות קריאה וכתיבה על קבצים, תהליכים להרוג, וכן הלאה. יש רשימה של מאות שיחות מערכת על syscalls דף גבר .
קָשׁוּר: Debugging עם GDB: תחילת עבודה
התקנת strace
אם
סטריאו
כבר לא מותקן במחשב שלך, אתה יכול להתקין אותו בקלות רבה.
על אובונטו, להשתמש בפקודה זו:
sudo apt להתקין strace
על פדורה, הקלד את הפקודה:
sudo DNF להתקין strace
ביום Manjaro, הפקודה היא:
sudo pacman -Sy strace
צעדים ראשונים עם strace
נשתמש תוכנית קטנה להפגין
סטריאו
. זה לא עושה הרבה: הוא פותח את קובץ וכותב שורת טקסט אליו, וזה אין שום בדיקת שגיאות בה. זה פשוט גרזן מהיר כך שיש לנו משהו לשימוש עם
סטריאו
.
#include & lt; stdio.h & gt;
int main (int argc, argv char []) {
// ידית קובץ
FILE * fileGeek;
// לפתוח קובץ בשם "strace_demo.txt", או ליצור אותו
fileGeek = fopen ( "strace_demo.txt", "W");
// לכתוב טקסט כלשהו לקובץ
fprintf (fileGeek, "כתוב את זה לקובץ");
// לסגור את התיק
fclose (fileGeek);
// יציאה מתוכנית
לחזור (0);
} // סוף הראשי
חסכנו זה לתוך קובץ בשם "קובץ-io.c" ונערך זה עם
ג"ץ
לתוך הפעלה המכונית
stex
, על שם "
רחוב
גזע
לְשֶׁעָבַר
מַסְפִּיק."
gcc -o stex קבצים io.c
אנחנו נתקשר
סטריאו
משורת הפקודה ולהעביר את קובץ הרצת החדש שלנו אליו כאל תהליך שאנחנו רוצים יש לייחס. אנחנו יכולים באותה קלות להתחקות כל הפקודות לינוקס או כל הפעלה בינאריים אחרים. אנו משתמשים בתכנית הזעירה שלנו משתי סיבות.
הסיבה הראשונה היא כי
סטריאו
הוא מפורט. יכול להיות הרבה תפוקה. זה נהדר כאשר אתה משתמש
סטריאו
בכעס, אבל זה יכול להיות מכריע בהתחלה. יש מוגבל
סטריאו
פלט עבור התכנית הזעירה שלנו. הסיבה השנייה היא כי התכנית שלנו יש פונקציונליות מוגבלת, ואת קוד המקור הוא קצר וישיר. זה מקל לזהות אילו חלקים של הפלט מעיינים בחלקים השונים של המנגנון הפנימי של התכנית.
strace ./stex
אנו יכולים לראות בבירור את
לִכתוֹב
קריאת המערכת שולחת את הטקסט "כתוב את זה לקובץ" קובץ נפתח שלנו ואת
exit_group
קריאת המערכת. זו תפקע כל הנושאים ביישום ושולח בחזרה ערך החזרה הקליפה.
סינון הפלט
אפילו עם תוכנית ההפגנה פשוט שלנו, יש די הרבה תפוקה. אנו יכולים להשתמש
-
אפשרות (ביטוי). אנחנו עוברים על פני שמו של קריאת המערכת שאנחנו רוצים לראות.
strace -e כתיבה ./stex
אתה יכול לדווח על שיחות מערכת מרובים ידי הוסיף כרשימה מופרדת בפסיקים. אין לכלול רווחים ברשימת שיחות המערכת.
strace -e קרוב, כתיבה ./stex
שליחת הפלט לקובץ
היתרון של סינון התפוקה היא גם בעיה עם סינון הפלט. אתה רואה מה שאתה ביקשת לראות, אבל אתה לא רואה שום דבר אחר. וחלק כי פלט אחרים עשוי להיות שימושי יותר מאשר לך את הדברים שאתה ביקשת לראות.
לפעמים, זה יותר נוח הכל ללכוד ולחפש וגלילה באמצעות הסט השלם של תוצאות. ככה, אתה לא תהיה הדרה בטעות משהו חשוב. ה
-
(פלט) אפשרות מאפשרת לך לשלוח את הפלט של
סטריאו
מושב לקובץ טקסט.
strace -O עקבות-output.txt ./stex
אז אתה יכול
להשתמש ב
פָּחוּת
פקודה
כדי לגלול רשימה ולחפש שיחות-או מערכת דבר אחר-ידי שם.
פחות עקבות-output.txt
עכשיו אתה יכול להשתמש בכל
פָּחוּת
של יכולות החיפוש לחקור את התפוקה.
קָשׁוּר: כיצד להשתמש פחות הפיקוד על לינוקס
הוספת חותמות זמן
אתה יכול להוסיף מספר חותמות זמן שונה לתפוקה. ה
--R
(חותם זמן יחסית) אפשרות מוסיפה חותמות זמן המציגים את פרש הזמן בין התחילה כול שיחת מערכת רצופה. שים לב שהערכים זמן אלה יכללו את משך הזמן לשיחה וכל דבר המערכת הקודמת אחר שהתוכנית עושה לפני קריאת המערכת הבאה.
strace -r ./stex
חותמות הזמן מוצגים בתחילת כל שורה של הפלט.
כדי לראות את כמות הזמן המושקע בכל שיחת המערכת, להשתמש
-
אפשרות (syscall-פי). זה מראה את משך הזמן המושקע בתוך כל שיחה המערכת.
strace -T ./stex
משכי זמן מוצגים בסוף כל שורה קריאת המערכת.
כדי לראות את השעה שבה כל שיחה המערכת נקראה, להשתמש
-tt
אפשרות (חותמות זמן מוחלט). זה מראה את הזמן "שעון קיר", עם רזולוציה מיקרו.
strace -tt ./stex
הזמנים מוצגים בתחילת כל שורה.
איתור תהליך רץ
אם התהליך שאתה רוצה עקבות כבר פועל, אתה עדיין יכול לצרף
סטריאו
אליו. כדי לעשות זאת, אתה צריך לדעת את זהות התהליך. אתה יכול
להשתמש
נ.ב
עם
grep
כדי למצוא את זה. יש לנו להפעיל את Firefox. כדי לברר את הזהות של
Firefox
תהליך, אנו יכולים להשתמש
נ.ב
ו
צינור זה באמצעות
grep
.
ps -e | grep Firefox
אנו יכולים לראות כי מזהים התהליך 8483. אנו נשתמש
-
(תהליך הזיהוי) אפשרות לספר
סטריאו
אשר לעבד לצרף. שים לב, אתה תצטרך להשתמש
סודו
-
sudo strace -p 8483
תראה הודעה המציינת כי
סטריאו
והיא נקשרה התהליך, ולאחר מכן את שיחות עקבות מערכת יוצג בחלון הטרמינל כרגיל.
יצירת דוח
ה
-c
(רק סיכום) הגורמים אופציה
סטריאו
כדי להדפיס דוח. זה יוצר טבלה עבור מידע על השיחות במערכת שבוצעו על ידי תוכנית לייחס.
strace -c ./stex
העמודות הן:
- זמן% : אחוז זמן הביצוע שהושקע בכל שיחת מערכת.
- שניות : הזמן הכולל לידי ביטוי בשניות ומיקרו שניות בילה בכל שיחת מערכת.
- USECS / CALL. : הזמן הממוצע ב microseconds בילה בכל שיחת מערכת.
- שיחות : מספר הפעמים שכל שיחת מערכת הוצעה.
- שגיאות : מספר הכישלונות עבור כל שיחת מערכת.
- syscall : שם שיחת המערכת.
ערכים אלה יראו אפסים לתוכניות טריוויאליות שמבצעות ומסתיימות במהירות. ערכי העולם האמיתי מוצגים עבור תוכניות שעושות משהו משמעותי יותר מאשר יישום ההפגנה שלנו.
תובנות עמוקות, בקלות
ה
סטריאו
פלט יכול להראות לך איזו שיחות מערכת נעשות, אילו מהם נעשים שוב ושוב, וכמה זמן ביצוע הוא להיות בילה בקוד בצד הקרנל. זה מידע נהדר. לעתים קרובות, כאשר אתה מנסה להבין מה קורה בתוך הקוד שלך, קל לשכוח כי הבינארי שלך הוא אינטראקציה כמעט ללא הפסקה עם הקרנל לבצע רבות של פונקציות שלה.
על ידי שימוש ב
סטריאו
, אתה רואה את התמונה המלאה.