C/C++中的调试原则/核心主题

bqu*_*i56 10 c c++ testing debugging

我有兴趣投入大量时间来提高我的调试能力,并且正在寻找我需要涵盖的核心主题列表,以便精通常用和高级调试/测试技术的原则.

最初,我想我会阅读gdb文档并从其功能中收集调试技术; 然而,除了跳到它以获得段错误的行号并且可能正在运行之外bt,几个月后我仍然采用质量printf作为我的默认策略.我觉得这是因为我没有任何明确的策略,我可以通过更复杂的方式来实现.

虽然我的问题与C/C++有关,虽然我在UNIX环境中运行,但我愿意看一下通用材料,甚至是其他语言所涵盖的主题,如果它们能够提高我对关键概念的理解.

Ale*_* C. 10

您有多种直接策略,您应该考虑:

  • Mass printfs为记录解决方案而哭泣.这里有很多选项,但是广泛记录并不是特别糟糕的策略,它实际上对任何形式的客户端调试都至关重要.
  • 广泛使用断言(并且永远不会禁用它们,即使在"释放"代码中也是如此).始终对所有潜在错误进行检查并尽快失败(在C++中使用异常 - 总是抛出,永远不会捕获).
  • 学习在emacs中掌握gdb非常有用.学习如何步骤程序,如何设置断点以及如何检查局部变量通常是绰绰有余的.
  • 单元测试也是需要考虑的事情.特别是因为小测试更容易调试,因为它们没有被全功能程序的噪音所包围.在代码之前编写测试,或者更好,让其他人编写测试.

更一般地说,以下几点虽然与调试没有直接关系,但对您有益:

  • 学习如何执行程序(例如学习堆栈帧和组装的小介绍)可能在某些错误破坏内存的情况下很有用.更一般地说,永远不要停止学习有关环境的东西.
  • 在C++中,使用良好实践:RAII,标准库,尽快失败等.这有减少调试工作的强烈倾向,尤其是.因为调试器可以很好地打印标准库中的东西.此外,尽可能简单地编码对调试时间有积极影响.
  • 使用(分布式)版本控制.总是.一旦你习惯了它,你就会看到好处(例如,结合单元测试,你git bisect可以获得全能).