Tuesday, May 17, 2016

[debug] rr 全名是 record and replay

以下轉自:
https://m.facebook.com/story.php?story_fbid=10204658121093179&id=1840131181

今天突然想到我似乎沒發文推廣過 rr 這個神級的 debug 工具(又稱軟體工程師的時光機),這麼好用的東西不能只有我知道
rr 全名是 record and replay,只要你的程式跑在 Linux 上,可以用 gdb debug(例如 C/C++/Rust 寫的程式),都可以用 rr 把程式的執行結果錄下來,再反覆的用 rr 重播,並用 gdb debug。這能完全改寫你除錯程式的經驗,它有以下特色:
1. 在這個 record 中,記憶體位址是不變的,所以可以反覆用 gdb 去看程式資料的變化。你也不必怕 gdb 當掉,毀掉你辛苦重製的環境,而你在筆記本記的 memory address 都泡湯)
2. 因為你在 debug 錄下來的程式執行過程,所以你甚至可以「倒著」執行程式。 一般 gdb 的必用的指令如 step、continue,rr 都提供了的反向版的 reverse-step、reverse-continue。
以常見的 debug null pointer crash 為例,通常都是某個物件被某個不知道在哪的函式 F 放掉了,但你執行到程式 crash 時,不知名的 F 不知道在 crash 前多早就執行了。如果這個 crash 很難重製,程式又不是你寫的,你就只能慢慢熟悉程式,印 log,找出可以穩定重製的步驟…然後自求多福(超花時間)。
如果用了 rr,你就只要重製出 crash 一次,再 replay。等到程式 crash,設定個 watch point 在被設成 null 的變數,下 reverse-continue 倒著執行程式回去。馬上抓到兇手!多的時間就可以開始研究程式的邏輯了。
rr 在我 debug Firefox 這麼複雜的程式時真的幫我很多忙,一堆 ref-counted 的物件加上 event 飛來飛去,程式邏輯真的不會照你想的運作。
如果你開發的程式在 Linux 上,不妨試試。如果有老師在教學生用 gdb,也不妨也告訴學生有 rr 這個工具,讓學生的程式生涯輕鬆一點。

rr網站:
http://rr-project.org/

No comments: