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