需求
想要了解模組之間函式呼叫的關係時, 與其一層層比對多個類別之間的呼叫關係, 不如直接在最後一個呼叫函式放中斷點, 直接顯示 backtrace。但是當函式裡有太多參數或 template 時, backtrace 的 frame 訊息會變得很長, 不易閱讀。我的目的只是找出呼叫的函式名稱、檔名和行數, 函式帶的參數反而是困擾。
作法一: 用 gdb.execute()
一個簡單的作法是截取 gdb 的輸出, 然後解析文字去掉不要的部份:
Btw, 上面的作法還順便幫行首的標號上色。
但是, 使用 cgdb 時會無法運作, 理由是 cgdb 使用 GDB MI, gdb.execute('backtrace') 的結果不是原本看到的格式, 難以解析。
作法二: 用 gdb.Frame() API
只好改用中規中矩的方式逐一讀取 frame, 取出需要的資訊:
將上面的 script 存到 /path/to/gdb/scripts/backtrace.py, 接著在 $HOME/.gdbinit 裡加入以下設定:
python sys.path.insert(0, '/path/to/gdb/scripts') import backtrace end
之後就能用 bt 顯示精簡後的 backtrace 了, 也方便手動複製貼上到筆記裡。以下是一個輸出例子:
(gdb) bt # 0 A::hello at a.cpp:8 # 1 A::bar at a.cpp:13 # 2 A::foo at a.cpp:18 # 3 main at a.cpp:25
Btw, 若是需求比較簡單, 可以試看看 Print Settings, 有些選項可以改變 backtrace 顯示的訊息。
沒有留言:
張貼留言