פרק 13: מאת כריסטיאן ביזינגר במדיסון, ויסקונסין (מרץ 2020)
הפרקים הקודמים
מוצאים את עצמכם מריצים את אותה בדיקה שוב ושוב בכלי לניפוי באגים,
מנסה להבין איך הקוד הגיע למצב לא טוב? יש לנו כלי בשבילכם!
אפשר להתקין ולהגדיר אותו בקלות, הוא יתעד מעקב אחר הביצוע,
כוחות קסומים חדשים ל-gdb
. לחזור אחורה, לרוץ אחורה, לראות איפה
שינו את הערך שלהם, או את ההפעלה האחרונה של פונקציה על אובייקט
(באמצעות נקודות עצירה מותנות).
ב-Linux, אפשר להשתמש ב-rr. התקנה באמצעות sudo apt-get install rr
או
מתוך https://rr-project.org/.
אין תמיכה רשמית בפורמט הזה, אבל מאוד שימושי. כך פועל rr
קודם כל מקליטים מעקב ואז מפעילים אותו מחדש.
rr record .../content_shell --no-sandbox --disable-hang-monitor --single-process
# record the trace. --single-process is optional, see below. The other flags are required.
rr replay # This will replay the last trace
(gdb) # rr uses GDB to let you replay traces
לנוחיותכם, כתובות ה-URL והתזמון נשארות ללא שינוי בכל פעם שתפעילו את הסרטון מחדש
אותו מעקב. ניתן להפוך את נתוני המעקב לנייד באמצעות rr pack
,
להעתיק אותם למחשב אחר ולהפעיל אותם שוב שם, או להפעיל אותם שוב גם לאחר
הידור מחדש. אפשר להפעיל את התוכנית באמצעות continue
. אפשר להשתמש בכל
פקודות GDB -b
, next
, watch
וכו'. עם זאת, אפשר גם להשתמש
היפוך-הבא (rn
), היפוך-המשך (rc
), שלב הפוך (rs
),
היפוך סנפיר.
נקודות העצירה (breakpoint) האלה עדיין יישמרו. לדוגמה:
(gdb) c # Execute to the end
(gdb) break blink::LayoutFlexibleBox::UpdateLayout
(gdb) rc # Run back to the last layout call
Thread 5 hit Breakpoint 1, blink::LayoutBlock::UpdateLayout (
this=0x121672224010)
(gdb) # Inspect anything you want here. To find the previous Layout call on this object:
(gdb) cond 1 this == 0x121672224010
(gdb) rc
Thread 5 hit Breakpoint 1, blink::LayoutBlock::UpdateLayout (
this=0x121672224010)
(gdb) watch -l style_.ptr_ # Or find the last time the style_ was changed
(gdb) rc
Thread 5 hit Hardware watchpoint 2: -location style_.ptr_
Old value = (const blink::ComputedStyle *) 0x1631ad3dbb0
New value = (const blink::ComputedStyle *) 0x0
0x00007f68cabcf78e in std::__Cr::swap<blink::ComputedStyle const*> (
בדוגמה הזאת השתמשתי ב---single-process
לצורך פשטות, אבל זו
אין צורך. RR יכול לעקוב אחר תהליכים מרובים; אחרי ההקלטה, אפשר
ראה רשימה באמצעות rr ps
ובחר אחת כדי להפעיל מחדש עם rr replay -f PID
.
יש הרבה דרכים שבהן RR יכול להיות שימושי. יש פקודות אחרות שאפשר להשתמש בהן,
למשל, מתי לדעת באיזה מספר אירוע אתם נמצאים, או rr replay -M
כדי להוסיף הערות ל-stdout
עם מזהה תהליך ומספר אירוע בכל שורה. צפייה
פרטים נוספים זמינים באתר של RR ובמסמכים.