乐读Debug Hacks除错骇客

Debug Hacks除错骇客:极致除错的技巧与工具

苦劳的程式设计师朋友们,你是否也像ㄚ琪一样一直在为程式除错伤脑筋?一直以来ㄚ琪都是用土法找虫,这一本Debug Hacks除错骇客:极致除错的技巧与工具来到我的家中,顿让ㄚ琪觉得宽心不少。看起来不错,就先让我们瞧瞧博客来的介绍吧↓↓↓↓↓↓↓

[adsense][/adsense]

极致除错的技巧与工具

  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做好准备
    • 与同事说明
    • 寻求社群协助

这里所列的经验,仿佛ㄚ琪都有碰过,只不过没有好好记录下来分享给各位,今天有人作的这么好整理了很完整的资讯,该是拍拍手鼓励的时候了,那就让我们继续快乐的读下去吧。