זוהי הפקודה strace64 שניתן להפעיל בספק האירוח החינמי של OnWorks באמצעות אחת מתחנות העבודה המקוונות המרובות שלנו, כגון Ubuntu Online, Fedora Online, אמולטור מקוון של Windows או אמולטור מקוון של MAC OS
תָכְנִית:
שֵׁם
strace - מעקב אחר קריאות ואותות מערכת
תַקצִיר
שטרס [-CdffhikqrtttTvVxxy] [-In] [-bבכיר] [-eביטוי]... [-aסקירה]
[-oפילה] [-sstrsize] [-Pנתיב] ... -pPID... / [-D] [-Eהיה[=val]]...
[-uשם משתמש] הפקודה [טוען]
שטרס -c[df] [-In] [-bבכיר] [-eביטוי]... [-Oממעל] [-Sמיין לפי]
-pPID... / [-D] [-Eהיה[=val]]... [-uשם משתמש] הפקודה [טוען]
תיאור
במקרה הפשוט ביותר שטרס מריץ את המצוין הפקודה עד שהוא יוצא.
הוא מיירט ומקליט את שיחות המערכת אשר נקראות על ידי א
תהליך והאותות המתקבלים בתהליך. השם של
על כל קריאת מערכת, הארגומנטים שלה וערך ההחזר שלה מודפסים
שגיאת תקן או לקובץ שצוין עם ה- -o אוֹפְּצִיָה.
שטרס הוא כלי שימושי לאבחון, הדרכה וניפוי באגים.
מנהלי מערכת, מאבחנים ופותרי תקלות ימצאו אותו
לא יסולא בפז לפתרון בעיות עם תוכניות שהמקור להן
לא זמינים כיוון שאין צורך להידור מחדש לפי הסדר
להתחקות אחריהם. סטודנטים, האקרים וסקרנים מדי ימצאו את זה
ניתן ללמוד הרבה על מערכת ושיחות המערכת שלה
מעקב אפילו אחר תוכניות רגילות. ומתכנתים ימצאו את זה מאז
קריאות וסימנים של המערכת הם אירועים המתרחשים במשתמש/הליבה
ממשק, בחינה מדוקדקת של גבול זה שימושית מאוד עבור באג
בידוד, בדיקת שפיות וניסיון ללכוד את תנאי הגזע.
כל שורה בעקיבה מכילה את שם קריאת המערכת, ואחריו שלה
ארגומנטים בסוגריים וערך ההחזר שלו. דוגמה מ
חיפוש הפקודה "cat /dev/null" הוא:
open("/dev/null", O_RDONLY) = 3
לשגיאות (בדרך כלל ערך החזרה של -1) יש את סמל השגיאה והשגיאה
מחרוזת צורפה.
open("/foo/bar", O_RDONLY) = -1 ENOENT (אין קובץ או ספרייה כאלה)
אותות מודפסים כסמל אות ומבנה סימני מידע מפוענח. א
קטע מתוך הפקודה "שינה 666" והפרעה היא:
sigsuspend([]
--- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} ---
+++ נהרג על ידי SIGINT +++
אם מתבצעת שיחת מערכת ובינתיים מתבצעת עוד אחת
התקשרו משרשור/תהליך אחר אז שטרס ינסה לשמר
את סדר האירועים הללו ולסמן את השיחה המתמשכת כהוויה
לא גמור. כאשר השיחה תחזור היא תסומן כ התחדש.
[pid 28772] select(4, [3], NULL, NULL, NULL
[pid 28779] clock_gettime(CLOCK_REALTIME, {1130322148, 939977000}) = 0
[pid 28772] <... בחר מחדש> ) = 1 (ב-[3])
הפרעה של שיחת מערכת (ניתנת להפעלה מחדש) על ידי מסירת אות היא
מעובד בצורה שונה כאשר הקרנל מסיים את קריאת המערכת וגם
מסדר את הביצוע המידי שלו לאחר שמטפל האותות סיים.
read(0, 0x7ffff72cf5cf, 1) = ? ERESTARTSYS (להפעלה מחדש)
--- SIGALRM ... ---
rt_sigreturn(0xe) = 0
read(0, "", 1) = 0
טיעונים מודפסים בצורה סמלית עם תשוקה. הדוגמה הזו
מציג את המעטפת שמבצעת הפניית פלט ">>xyzzy":
open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
כאן הארגומנט השלישי של פתיחה מפוענח על ידי פירוק הדגל
ארגומנט לשלושת מרכיבי ה-OR הביטביים שלו והדפסת המצב
ערך באוקטאל לפי המסורת. כאשר השימוש המסורתי או המקור שונה
מ-ANSI או POSIX, העדיפו את הצורות האחרונות. במקרים מסוימים,
שטרס הפלט הוכח כקריא יותר מהמקור.
מצביעי מבנה מורחקים והאיברים מוצגים בתור
מתאים. בכל המקרים הארגומנטים מעוצבים בצורה הכי דומה ל-C
אופנה אפשרית. לדוגמה, המהות של הפקודה "ls -l
/dev/null" נלכד כ:
lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
שימו לב לאופן שבו ניתנת ההתייחסות לארגומנט 'struct stat' וכיצד כל אחד מהם
חבר מוצג באופן סמלי. בפרט, שים לב כיצד
חבר st_mode מפוענח בקפידה ל-Bitwise-OR של סימלי ו
ערכים מספריים. שימו לב גם בדוגמה זו שהטיעון הראשון ל
lstat הוא קלט לקריאת המערכת והארגומנט השני הוא an
תְפוּקָה. מאז ארגומנטים פלט אינם משתנים אם המערכת קוראת
נכשל, טיעונים לא תמיד ניתנים להתייחסות. לדוגמה, מנסה שוב
הדוגמה "ls -l" עם קובץ לא קיים מייצרת את הדברים הבאים
קַו:
lstat("/foo/bar", 0xb004) = -1 ENOENT (אין קובץ או ספרייה כאלה)
במקרה זה אור המרפסת דולק אבל אף אחד לא בבית.
מצביעי תווים מורחקים ומודפסים כמחרוזות C. לֹא-
הדפסת תווים במחרוזות מיוצגים בדרך כלל על ידי C רגיל
קודי בריחה. רק הראשון strsize (32 כברירת מחדל) בתים של מחרוזות
מודפסים; למיתרים ארוכים יותר יש אליפסיס מצורף בעקבות ה-
הצעת מחיר סגירה. הנה שורה מ-"ls -l" שבה ה- getpwuid ספריה
השגרה קוראת את קובץ הסיסמה:
read(3, "root::0:0:System Administrator:/"..., 1024) = 422
בעוד מבנים מובאים באמצעות פלטה מתולתלת, מצביעים פשוטים ו
מערכים מודפסים באמצעות סוגריים מרובעים עם פסיקים מפרידים
אלמנטים. הנה דוגמה מהפקודה "id" במערכת עם
מזהי קבוצות משלימות:
getgroups(32, [100, 0]) = 2
מצד שני, ערכות סיביות מוצגות גם באמצעות סוגריים מרובעים אבל
רכיבי קבוצה מופרדים רק על ידי רווח. הנה הקליפה
מתכונן לביצוע פקודה חיצונית:
sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0
כאן הארגומנט השני הוא קבוצת סיביות של שני אותות, SIGCHLD ו
SIGTTOU. במקרים מסוימים ערכת הסיביות כה מלאה עד שהדפסת ה-
אלמנטים לא מוגדרים הם בעלי ערך רב יותר. במקרה זה, ערכת הסיביות מקבלת קידומת
על ידי טילדה כזו:
sigprocmask(SIG_UNBLOCK, ~[], NULL) = 0
כאן הארגומנט השני מייצג את הסט המלא של כל האותות.
אפשרויות
-c ספירת זמן, שיחות ושגיאות עבור כל קריאת מערכת
ולדווח על סיכום על יציאת התוכנית. בלינוקס,
זה מנסה להראות את זמן המערכת (זמן המעבד המושקע
פועל בליבה) ללא תלות בשעון קיר
זְמַן. אם -c משמש עם -f or -F (למטה), בלבד
נשמרים סכומים מצטברים עבור כל התהליכים שהתחקו אחריהם.
-C כמו -c אבל גם להדפיס פלט רגיל תוך כדי
תהליכים פועלים.
-D הפעל את תהליך המעקב כנכד מנותק, לא כמו
הורה של הנעקב. זה מקטין את הגלוי
השפעה של שטרס על ידי שמירה על עקבות ישירה
ילד של תהליך ההתקשרות.
-d הצג פלט של ניפוי באגים של שטרס עצמו על
שגיאת תקן.
-f עקבו אחר תהליכי ילד כפי שהם נוצרים על ידי
תהליכים שנמצאים כיום במעקב כתוצאה מה
מזלג(2), vfork(2) ו לשבט(2) שיחות מערכת. הערה
זֶה -p מח"ש -f יצרף את כל שרשורי התהליך
PID אם הוא מרובה הליכי, לא רק פתיל עם
thread_id = PID.
-ff אם -o שם הקובץ האפשרות בתוקף, כל אחד
נכתב מעקב אחר תהליכים filename.pid איפה pid
הוא מזהה התהליך המספרי של כל תהליך. זה
לא תואם -c, מכיוון שאף תהליך לא נחשב
נשמרים.
-F אפשרות זו מיושנת כעת ויש לה את אותו הדבר
פונקציונליות כמו -f.
-h הדפס את תקציר העזרה.
-i הדפס את מצביע ההוראות בזמן ה-
שיחת מערכת.
-k הדפס את עקבות מחסנית הביצוע של המעקב
תהליכים לאחר כל קריאת מערכת (ניסיוני).
אפשרות זו זמינה רק אם שטרס בנוי
עם Libunwind.
-q הדחק הודעות על הצמדה, ניתוק וכו'.
זה קורה באופן אוטומטי כאשר הפלט מופנה מחדש
לקובץ והפקודה מופעלת ישירות במקום
מצרף.
-qq אם ניתן פעמיים, דחק הודעות על יציאה מהתהליך
מעמד.
-r הדפס חותמת זמן יחסית עם הכניסה לכל מערכת
שִׂיחָה. זה מתעד את הפרש הזמן בין ה
תחילת קריאות מערכת עוקבות.
-t הקדמת כל שורה של המעקב עם השעה ביום.
-ט אם ניתן פעמיים, הזמן המודפס יכלול את
מיקרו שניות.
-tt אם ניתן שלוש פעמים, הזמן המודפס יכלול את
מיקרו-שניות והחלק המוביל יודפס
כמספר השניות מאז התקופה.
-T הצג את הזמן שהושקע בשיחות מערכת. זה מתעד
הפרש הזמן בין ההתחלה ל-
סוף כל שיחת מערכת.
-w סכמו את הפרש הזמן בין ההתחלה
וסיום כל שיחת מערכת. ברירת המחדל היא ל
לסכם את זמן המערכת.
-v הדפס גרסאות לא מקוצרות של סביבה, סטטיסטיקה,
שיחות טרמיוס וכו'. המבנים האלה מאוד
נפוץ בשיחות ולכן התנהגות ברירת המחדל מוצגת
תת-קבוצה סבירה של חברי מבנה. השתמש בזה
אפשרות לקבל את כל הפרטים העגומים.
-V הדפס את מספר הגרסה של שטרס.
-x הדפס את כל המחרוזות שאינן ASCII במחרוזת הקסדצימלית
פורמט.
-xx הדפס את כל המחרוזות בפורמט מחרוזת הקסדצימלית.
-y הדפס נתיבים המשויכים לתיאור הקובץ
ארגומנטים.
- יא הדפס זוגות ip:port המשויכים לקובץ socket
מתארים.
-a סקירה יישר ערכי החזרה בעמודה ספציפית (ברירת מחדל
עמודה 40).
-b סיסקאל אם הושג מערכת הפעלה שצוינה, התנתק מהמעקב
תהליך. נכון לעכשיו, בלבד בכיר syscall הוא
נתמך. אפשרות זו שימושית אם תרצה בכך
להתחקות אחר תהליך מרובה הליכי ולפיכך לדרוש
-f, אבל לא רוצה להתחקות אחריו (יכול להיות מאוד
מורכבים) ילדים.
-e ביטוי ביטוי מזכה שמשנה אילו אירועים
להתחקות אחר או איך להתחקות אחריהם. הפורמט של ה
הביטוי הוא:
[להעפיל=][!]value1[,value2] ...
איפה להעפיל הוא אחד להתחקות, קיצור, מִלוּלִי,
חי, אוֹת, לקרוא, או לכתוב ו ערך הוא
סמל או מספר תלויי מוקדמות. ברירת המחדל
המוקדמות היא להתחקות. שימוש בסימן קריאה
שולל את מערכת הערכים. לדוגמה, -e לפתוח
פירושו מילולית -e להתחקות=לפתוח מה שבתורו אומר
לעקוב רק אחר לפתוח שיחת מערכת. בניגוד,
-e להתחקות=!לפתוח פירושו להתחקות אחר כל קריאת מערכת
אלא לפתוח. בנוסף, הערכים המיוחדים את כל
ו אף לא אחד יש את המשמעויות הברורות.
שימו לב שחלק מהקליפות משתמשות בסימן הקריאה עבור
הרחבת ההיסטוריה אפילו בתוך טיעונים מצוטטים. אם
לכן, עליך לברוח מסימן הקריאה עם א
מַהֲלָך סְרָק.
-e להתחקות=סט
עקוב רק אחר קבוצת קריאות המערכת שצוינה. ה
-c אפשרות שימושית לקביעת איזו מערכת
שיחות עשויות להיות שימושיות למעקב. לדוגמה,
להתחקות=לפתוח, לסגור, לקרוא, לכתוב פירושו רק להתחקות
ארבע שיחות המערכת האלה. היזהר בעת הכנת
מסקנות לגבי גבול המשתמש/הליבה אם רק א
תת-קבוצה של שיחות מערכת נמצאות במעקב. ה
ברירת המחדל היא להתחקות=את כל.
-e להתחקות=פילה
עקבו אחר כל קריאות המערכת שמקבלות שם קובץ בתור
טַעֲנָה. אתה יכול לחשוב על זה כעל קיצור
ל -e להתחקות=לפתוח,stat,chmod,הקישור,... כלומר
שימושי כדי לראות באילו קבצים מדובר
מפנה. יתר על כן, שימוש בקיצור
יבטיח שלא תשכח בטעות
לכלול שיחה כמו lstat ברשימה. בטצ'יה
הייתי שוכח את זה
-e להתחקות=תהליך
עקבו אחר כל קריאות המערכת הכרוכות בתהליך
הַנהָלָה. זה שימושי לצפייה במזלג,
המתן, וביצוע שלבים של תהליך.
-e להתחקות=רשת
עקוב אחר כל שיחות המערכת הקשורות לרשת.
-e להתחקות=אוֹת
עקבו אחר כל קריאות המערכת הקשורות לאותות.
-e להתחקות=ipc
עקוב אחר כל קריאות המערכת הקשורות ל-IPC.
-e להתחקות=יורד
עקבו אחר כל קריאות המערכת הקשורות לתיאור הקבצים.
-e להתחקות=זיכרון
עקבו אחר כל קריאות המערכת הקשורות למיפוי זיכרון.
-e קיצור=סט
קיצור הפלט מההדפסה של כל חבר ב
מבנים גדולים. ברירת המחדל היא קיצור=את כל. ה
-v לאופציה יש השפעה של קיצור=אף לא אחד.
-e מִלוּלִי=סט
מבני התייחסות לקבוצה שצוינה של
שיחות מערכת. ברירת המחדל היא מִלוּלִי=את כל.
-e חי=סט הדפס ארגומנטים גולמיים לא מפוענחים עבור הסט שצוין
של שיחות מערכת. אפשרות זו משפיעה על
מה שגורם לכל הארגומנטים להיות מודפסים בהקסדצימליים.
זה שימושי בעיקר אם אתה לא סומך על
פענוח או שאתה צריך לדעת את המספר האמיתי
הערך של טיעון.
-e אוֹת=סט
עקבו רק אחר תת-קבוצת האותות שצוינה. ה
ברירת המחדל היא אוֹת=את כל. לדוגמה, אוֹת =! SIGIO
(אוֹ אוֹת=!io) גורם לאותות SIGIO לא להיות
התחקה אחר.
-e לקרוא=סט בצע dump מלא הקסדצימלי ו-ASCII של כל
נתונים שנקראו מתארי קבצים המפורטים ב
סט שצוין. לדוגמה, כדי לראות את כל הקלט
פעילות על מתארי קבצים 3 ו 5 להשתמש
-e לקרוא=3,5. שים לב שזה לא תלוי ב
מעקב רגיל של לקרוא(2) קריאת מערכת שהיא
נשלט על ידי האפשרות -e להתחקות=לקרוא.
-e לכתוב=סט
בצע dump מלא הקסדצימלי ו-ASCII של כל
נתונים שנכתבו לתיאורי קבצים המפורטים ב
סט שצוין. לדוגמה, כדי לראות את כל הפלט
פעילות על מתארי קבצים 3 ו 5 להשתמש
-e לכתוב=3,5. שימו לב שזה לא תלוי ב
המעקב הרגיל של ה לכתוב(2) קריאת מערכת אשר
נשלט על ידי האפשרות -e להתחקות=לכתוב.
-I בלתי ניתן להפרעה
כאשר רצועה יכולה להיקטע על ידי אותות (כגון
לחיצה על ^C). 1: אין אותות חסומים; 2: קטלני
האותות נחסמים בזמן פענוח ה-syscall
(בְּרִירַת מֶחדָל); 3: אותות קטלניים תמיד חסומים
(ברירת מחדל אם '-o FILE PROG'); 4: אותות קטלניים ו
SIGTSTP (^Z) חסומים תמיד (שימושי לביצוע
strace -o FILE PROG לא עוצרים ב-^Z).
-o שם הקובץ כתוב את פלט המעקב לקובץ שם הקובץ במקום
מאשר לסטדרר. להשתמש filename.pid if -ff משמש.
אם הארגומנט מתחיל ב-'|' או עם '!' אז ה
שאר הטיעון מטופל כפקודה והכל
פלט מועבר אליו. זה נוח עבור
העברת פלט ניפוי הבאגים לתוכנית ללא
משפיע על ההפניות מחדש של תוכניות המבוצעות.
-O ממעל הגדר את התקורה למעקב אחר קריאות המערכת
ממעל מיקרו שניות. זה שימושי עבור
עוקף את היוריסטית ברירת המחדל לניחוש כיצד
זמן רב מושקע במדידה בלבד בזמן התזמון
שיחות מערכת באמצעות -c אוֹפְּצִיָה. הדיוק של
ניתן לאמוד את ההיוריסטיקה על ידי תזמון נתון
התוכנית פועלת ללא מעקב (באמצעות זמן(1)) ו
השוואת זמן השיחה המצטבר של המערכת ל-
סה"כ מיוצר באמצעות -c.
-p PID צרף לתהליך עם מזהה התהליך PID ו
להתחיל להתחקות. ניתן להפסיק את המעקב בכל מקרה
זמן על ידי אות פסיקה במקלדת (CTRL-C).
שטרס יגיב על ידי ניתוק מה-
מעקב אחר תהליך(ים) ומשאיר אותו (הם) להמשיך
רץ. מרובות -p ניתן להשתמש באפשרויות לצירוף
לתהליכים רבים. -p תחביר "`pidof PROG`" הוא
נתמך.
-P נתיב מעקב אחר שיחות מערכת בלבד הנגישות נתיב. מְרוּבֶּה -P
ניתן להשתמש באפשרויות כדי לציין מספר נתיבים.
-s strsize ציין את גודל המחרוזת המקסימלי להדפסה (ה
ברירת המחדל היא 32). שים לב ששמות קבצים לא
נחשבים למחרוזות ותמיד מודפסות במלואן.
-S מיין לפי מיין את הפלט של ההיסטוגרמה המודפסת על ידי -c
אפשרות לפי הקריטריון שצוין. ערכים משפטיים הם
זמן, שיחות, שם, ו שום דבר (ברירת המחדל היא זמן).
-u שם משתמש הפעל פקודה עם מזהה המשתמש, מזהה הקבוצה ו
קבוצות משלימות של שם משתמש. אפשרות זו היא
שימושי רק כאשר פועל כשורש ומאפשר את
ביצוע נכון של קבצים בינאריים של setuid ו/או setgid.
אלא אם כן משתמשים באפשרות זו ב-setuid ו-setgid
תוכניות מבוצעות ללא הרשאות אפקטיביות.
-E היה=val הפעל פקודה עם היה=val ברשימת הסביבה שלו
משתנים.
-E היה להסיר היה מרשימת הסביבה שעברה בירושה
משתנים לפני העברתם לפקודה.
דיאגנוסטיקה
מתי הפקודה יציאות, שטרס יוצאים עם אותו סטטוס יציאה. אם
הפקודה מסתיים על ידי אות, שטרס מסיים את עצמו עם
אותו אות, כך ש שטרס יכול לשמש כתהליך עטיפה
שקוף לתהליך האב המזמין. שימו לב שהורה-
יחסי ילד (התראות על עצירת אות, ערך getppid(),
וכו') בין תהליך המעקב וההורה שלו אינם נשמרים
אלא אם כן -D משמש.
כשמשתמש -p, מצב היציאה של שטרס הוא אפס אלא אם כן
הייתה שגיאה בלתי צפויה בביצוע המעקב.
SETUID התקנה
If שטרס מותקן setuid ל-root ואז למשתמש המפעיל
יוכל לצרף ולעקוב אחר תהליכים בבעלות כל משתמש.
בנוסף יבוצעו תוכניות setuid ו-setgid ו
מעקב עם ההרשאות האפקטיביות הנכונות. מכיוון שרק משתמשים
מהימנים עם הרשאות שורש מלאות, יש לאפשר לעשות זאת
דברים, זה רק הגיוני להתקין שטרס כסטואיד לשורש
כאשר המשתמשים שיכולים לבצע אותו מוגבלים לאותם משתמשים
שיש להם את האמון הזה. לדוגמה, הגיוני להתקין א
גרסה מיוחדת של שטרס במצב 'rwsr-xr--', משתמש שורש ו
קבוצה להתחקות, שבו חברי ה להתחקות הקבוצה הם משתמשים מהימנים.
אם אתה משתמש בתכונה זו, אנא זכור להתקין מכשיר שאינו
גרסה setuid של שטרס לשימוש של לוזרים רגילים.
השתמש ב-strace64 באינטרנט באמצעות שירותי onworks.net
