發表文章

目前顯示的是 5月, 2010的文章

文章總列表

強力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 用軟體設定一些觸發條件 更精準的在需要的時間列印訊息, 這些就看使用者的需要了