推薦序
作者與致謝
寫在前面
第一章 暖身準備
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 用語的基礎知識
索引