Chromium Chronicle #13:使用 RR 進行時間旅行偵錯

第 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 指令 -bnextwatch 等。不過,您也可以使用 反向下一步 (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 網站和說明文件取得更多資訊。