第 13 集:Christian Biesinger 於威斯康辛州麥迪遜 (Christian Biesinger) 製作 (2020 年 3 月)
上一集
您是否發現自己在偵錯工具中重複執行相同測試?
這些程式碼是為什麼呢?我們有一項工具!
安裝及設定容易,並會記錄執行追蹤,
我們為 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
每次重播時,時機和指標地址都保持一致
相同的追蹤記錄使用 rr pack
可將追蹤記錄設為可攜性,
可以複製到其他機器然後重播
會發生這種問題使用 continue
執行程式。您可以使用
GDB 指令 -b
、next
、watch
等。不過,您也可以使用
反向下一步 (rn
)、反向接續 (rc
)、反向步驟 (rs
)、
reverse-fin。
這些動作仍會遵循你設定的所有中斷點。例如:
(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
使用程序 ID 和事件編號為 stdout
每一行加註。詳情請見
RR 網站和說明文件取得更多資訊。