樂讀Debug Hacks除錯駭客

Debug Hacks除錯駭客:極致除錯的技巧與工具

苦勞的程式設計師朋友們,你是否也像ㄚ琪一樣一直在為程式除錯傷腦筋?一直以來ㄚ琪都是用土法找蟲,這一本Debug Hacks除錯駭客:極致除錯的技巧與工具來到我的家中,頓讓ㄚ琪覺得寬心不少。看起來不錯,就先讓我們瞧瞧博客來的介紹吧↓↓↓↓↓↓↓

極致除錯的技巧與工具

  Miracle Linux的精銳工程師們,詳細解說長年Linux開發經驗累積的除錯知識。從預備基礎、必要知識,快速找到bug的原因、進行修正的便利技巧與工具,一直到進階除錯技巧都毫不保留地披露。滿載許多從實際範例推演的實用技巧,是高效率開發高品質程式必備的一本書。

本書所需的知識與目標讀者

本書主要的對象,是使用C/C++等程式語言的應用程式開發者、以及Linux kernel開發者。本書沒有特別假設語言、開發環境,但舉例的時候是使用Linux環境。在做低階除錯的時候,需要電腦架構、程式語言的基礎知識。另外也需要作為開發環境的Unix系列程式設計環境的基礎知識。除此之外的知識並未多做假設。

設想的讀者,是自己設計程式、實做、測試、除錯的初級到中級程式設計者;寫給希望進一步提昇自己程式設計能力的讀者。我們認為不僅C/C++程式設計者能獲益,對使用Perl/PHP/Python/Ruby等scripting語言寫程式的讀者來說,我們提到的許多手法,就算是語言、工具不一樣,還是能作為參考。另外對使用Windows與Mac等不同平台的程式設計者來說,同樣具有參考價值。

我們特別希望學生能閱讀本書。在看過一輪程式設計語言的入門書之後,如果想進一步精通程式設計的話,本書的hacks應該很有參考價值。我們總是抱著「如果這本書出現在自己學生時代的話一定很想看」的心態在編輯這本書。

對使用scripting語言寫程式的人來說,平常幾乎不會意識到電腦架構、機器語言等等。但若是Ruby的執行環境突然segmentation fault當掉、需要修復的時候,就需要本書討論的知識與技法了。對希望擴充自身程式設計領域的人來說,本書應該能成為契機。

我們也十分希望擁有獨自風格的hacker(程式設計老手)能閱讀本書,特別是現在幾乎沒有直接討論Linux kernel除錯的參考書,有關我們對這本書的組成,包含討論範圍、假想讀者群等等,不必客氣,儘管提供意見。當然如果能知道各位讀者「如果是自己的話會這麼做」的想法就太棒了。

目錄:

推薦序
作者與致謝
寫在前面

第一章 暖身準備
1. 何謂除錯?
2. Debug Hacks 地圖
3. Debug 經驗談

第二章 Debug 之前應該知道的事情
4. 取得 Process 的 Core Dump
5. Debugger (GDB) 的基本用法 (之一)
6. Debugger (GDB) 的基本用法 (之二)
7. Debugger (GDB) 的基本用法 (之三)
8. Intel 架構的基礎
9. Debug 需要的 Stack 基礎知識
10. 呼叫函式時傳遞引數的方式 (x86_64 篇)
11. 呼叫函式時傳遞引數的方式 (i386 篇)
12. 呼叫函式時傳遞引數的方式 (C++ 篇)
13. Assembly 的鍛鍊法
14. 從 Assembly 找出對應的原始碼

第三章 Kernel Debug 的準備
15. Oops 訊息的解讀法
16. 以 minicom 連上 serial console
17. 透過網路取得 kernel message
18. 透過 SysRq 按鍵進行除錯的方法
19. 使用 diskdump 取得 kernel crash dump
20. 使用 Kdump 取得 kernel crash dump
21. crash 指令的用法
22. 透過 IPMI watchdog timer 取得 freeze 時的 crash dump
23. 透過 NMI watchdog 取得 freeze 時的 crash dump
24. Kernel 特有的 Assembly 指令 (之一)
25. Kernel 特有的 Assembly 指令 (之二)

第四章 應用程式 Debug 實務
26. 程式接到 SIGSEGV 異常終止
27. Backtrace 無法正確顯示
28. 操作陣列失誤導致破壞記憶體內容
29. 活用 Watchpoint 偵測記憶體操作失誤
30. malloc() 與 free() 時發生問題
31. 應用程式卡住 (死結篇)
32. 應用程式卡住 (無窮迴圈篇)

第五章 Kernel Debug 實務
33. Kernel Panic (取用 NULL 指標篇)
34. Kernel Panic (List 破壞篇)
35. Kernel Panic (Race Condition 篇)
36. Kernel 卡住 (無窮迴圈篇)
37. Kernel 卡住 (Spinlock 篇之一)
38. Kernel 卡住 (Spinlock 篇之二)
39. Kernel 卡住 (Semaphore 篇)
40. Realtime Process 卡住
41. 運作變慢的問題
42. CPU 負荷變高的問題

第六章 致勝 Debug 技巧
43. 使用 strace 尋找問題原因的線索
44. objdump 方便的選項
45. Valgrind 的用法 (基本篇)
46. Valgrind 的用法 (實務篇)
47. 使用 kprobe 取得 kernel 內部的資訊
48. 使用 jprobe 取得 kernel 內部的資訊
49. 使用 kprobe 取得 kernel 內部任意位置的資訊
50. 使用 kprobe 取得 kernel 內部任意位置指定名稱的變數資訊
51. 使用 KAHO 取得 compiler 最佳化過程中移除的變數的值
52. 使用 systemtap 對執行中的 kernel 進行 debug (之一)
53. 使用 systemtap 對執行中的 kernel 進行 debug (之二)
54. 在 /proc/meminfo 可以看到的東西
55. 從 /proc//mem 高速讀取 process 的記憶體內容
56. OOM Killer 的動作與機制
57. Fault Injection
58. 使用 Fault Injection 發現 Linux kernel 潛在的 bug
59. Linux kernel 的 init section
60. 解決性能方面的問題
61. 使用 VMware Vprobe 取得資訊
62. 取得 Xen 的 memory dump
63. 理解透過 GOT/PLT 呼叫函式的機制
64. 為 initramfs image 進行 debug
65. 使用 RT Watchdog 偵測 realtime process 卡住的情形
66. 檢查手邊的 x86 機器是否支援 64-bit 模式
附錄 Debug Hacks 用語的基礎知識
索引

這本書主要的對象,是使用C/C++等程式語言的應用程式開發者、以及Linux kernel開發者,一看就有點暈到了,最近這陣子沒在玩C/C++,Linux kernel也與我漸行漸遠,看起來不適用啊,不過作者說對使用Perl/PHP/Python/Ruby等scripting語言寫程式的讀者來說,他們提到的許多手法,就算是語言、工具不一樣,還是能作為參考,希望不是為了廣告行銷說法,才特地加這一句,不然我可是會很惱的 😈

作者吉岡弘隆(Hiro Yoshioka)說是受到BINARY HACKS︰黑客秘笈100選所啟發,或許苦勞的兄弟姊妹們可以參閱看看,或許就不會悶悶了。

人客也可先試讀碁峰給的電子檔看看,ㄚ琪先試讀第一章 暖身準備 →何謂除錯? 這裡提到了參考文獻:The Art of Software Testing

這裡有兩個流程,轉貼出來給各位瞧瞧:

2013-03-21_143839

2013-03-21_144218

在第二小節的Debug Hacks 地圖裡頭兩張除錯的分類圖,感覺很好用,或許該是捲起袖子回來寫Linux程式的時候了。

 

2013-03-21_144301

2013-03-21_144404

 

在Debug 經驗談裡頭提到了4個經驗:

  1. 重現bug之前的經驗
    • 建立環境
    • 詢問
    • 檢查設定
  2. 重現bug之後的經驗
    • 確認現象
    • 確認重現率、時間
  3. 分析的經驗
    • 以眼睛確認現象
    • 盡可能縮小範圍
    • 透過Kernel Config、開機選項縮小範圍
    • 透過版本縮小範圍
    • 也確認其他做法
    • 跟句式時做判斷
  4. 問題原因不明時的經驗
    • 懷疑硬體
    • 尋找過去發生相同bug的修正
    • 無法重現、不知道原因的情形
    • 為發生Bug做好準備
    • 與同事說明
    • 尋求社群協助

這裡所列的經驗,彷彿ㄚ琪都有碰過,只不過沒有好好記錄下來分享給各位,今天有人作的這麼好整理了很完整的資訊,該是拍拍手鼓勵的時候了,那就讓我們繼續快樂的讀下去吧。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *