文章總列表

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

因為工作的關係, 我得用某段別人寫的code來做事
有句話是這麼說的, 用別人寫得code, 好比用在別人用過得保險套
雖然很噁心, 但是這句話真的是很貼切啊 XD

一個念頭閃過腦袋: 砍掉重練會不會比較好? 答案是: 不會 !!
因為這些程式碼都是經過千錘百鍊的結果
砍掉重練? 我還是先把自己砍掉好了 XD

像這種時候, 我就會換上作股票的思維: 會動的東西就是財產, 這才好過點


----


所以我先找了一些reference
王建興先生有一系列很不錯得文章 "閱讀他人的程式碼"
http://www.ithome.com.tw/itadm/article.php?c=47717

這些文章再讀一次, 感覺大不同了
我做好思想準備以後, 開始閱讀手邊的程式了

戰略目標是, 先完成手邊工作再說, 詳細運作細節可以之後慢慢推敲
我回想起以前當BBS站長, 我也是這樣讀那一堆程式碼, 突然覺得"親切"起來...


----


我想跟老大說, 我可以看個半年, 都會了以後再開工嗎?
我可能得在紙箱和開工之間做個選擇 Q_Q

在這種狀況下, 我只好用一些奇技淫巧, 這是這篇文章想說的東西
因為我看不懂很多程式, 但是我又得在時限內完成工作, 還有一些 bug 要找
來看看我用了哪些怪招吧

- Intercepting Arbitrary Function
- Back Trace

第一招用來攔截任意 function, 舉例來講, 很多地方都會呼叫 fprintf()
如果 printf() 有 source code 可以讓我改
我會想在裡面加點料, 看是來點 debug message 或是動點手腳

這件事做得到嗎?

基本上有兩個做法, C library 是真的有 source 可以改, 不過我完全不想用這招 XD
另一招是 setiathome 團隊用的, 他們去攔截 fstat/fopen/fwrite 這類的函數
把他導向到其他 function (當時要搬家到新平台, 他們不想改舊的 code)
這招就是我要得答案了 :D

已經有程式碼的東西就不用這麼大費周章了, 這招可以對付只有 library 的對象
實際施展起來, 我真的覺得太神奇了, 到底是誰發明 shared library 的這些怪招


----


Back Trace 的部份, 大部分的 debugger 都有提供 call stack 的功能
我"約略"知道大概要怎麼做, 不外乎是沿著 stack frame 往回找
找找傳回值, 然後在 symbol table 裡挖寶

我已經很有誠意的用 gdb 追蹤過一小段程式了, 自我感覺良好
自己寫一個出來? 你還是打死我吧 >_<

尋尋覓覓, 我總算找到關鍵字: backtrace support
程式執行到某個地方, 竟然可以像 Visual C++ 那樣印出 backtrace
看得我都感動起來了


----


把這兩招組合起來, 就是強力Debug技巧
我可以在任意時間點, 知道程式是怎麼呼叫浸來的
在這個時間點, 我似乎暫時可以逃離紙箱的追殺了 Q_Q

之後有空再把這些奇技淫巧貼上來~


----


Reference

1. Intercepting Arbitrary Functions on Windows, UNIX, and Macintosh OS X Platforms

2. Jserv: 深入淺出Hello World

3. Jserv: Who Call Me (更新版)

4. Programming from the Ground Up

5. Program Library HOWTO

6. 程式設計師的自我修養:連結、載入、程式庫

留言

這個網誌中的熱門文章

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

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

CANON G3000 廢墨瓶改裝