文章總列表

強力Debug技巧: 攔截function & Backtrace (3)

在使用 Visual C++ 這類程式時, 通常會內建 debugger, 可以印出 call trace
我在 trace 程式時, 也想知道某個function被呼叫時, 到底是誰呼叫他
我當然可以用 debugger 一個一個看, 不過效率實在有點差
如果可以 call 某個 function, 把 call trace 印出來, 那一定很讚...

答案就在 GNU LIBC 的 backtrace support
http://www.gnu.org/s/libc/manual/html_node/Backtraces.html
網站裡就有一個範例, 只要在編譯程式時, 多送上 -rdynamic 這個選項即可
直接拿回來複製貼上使用, 非常讚

實做這個機制已經是兩個月前了, 早已忘記細節, 這裡就不寫詳細步驟了

在研究這東西時, 不能不提 Jserv 網站的 who_call_me()
http://blog.linux.org.tw/~jserv/archives/002054.html
Jserv 這篇文章用 gdb 當工具, 詳細說明其實做方式
看懂這整個機制, 就能瞭解函數呼叫時, stack frame 的精神


----


使用上一篇講的技巧, 攔截所有的 fprintf()
在 wrapper function 裡呼叫 who_call_me()
如此我就能印出程式裡, 每次呼叫到 fprintf() 時, 究竟是怎麼 call 進去

在剛開始接手程式時, 面對一片不熟悉的程式
這個技巧讓我快速找出某個訊息是誰印的, 定位, 再追蹤前後的程式
拿到一個新的程式, 又有一些 schedule 的壓力, 他讓我不至於慌了手腳 :p

更進一步, 也可以在 wrapper function 用軟體設定一些觸發條件
更精準的在需要的時間列印訊息, 這些就看使用者的需要了

留言

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

幼犬書桌椅選擇心得 升降桌 兒童桌椅

CANON G3000 廢墨瓶改裝