如何调试一个巨大的不太熟悉的代码库?

Alo*_*ave 18 c c++ debugging

在大型项目工作期间,很快就会转移到一个已处于维护阶段的项目.最终你手上有一个巨大的代码C/C++代码库,并没有太多关于设计的文档.最后能够给你一些关于代码的知识转移的人已经离开了公司,并且为你的恐怖添加了没有足够的时间来熟悉代码并开发对整体模块的理解.在这种情况下,当你是期望修复模块上的错误(核心转储,功能,性能问题等)你将采取什么方法?

所以问题是:在尝试修复错误时,调试不太熟悉的C/C++代码库的常用步骤是什么?

编辑:Enviornment是Linux,但代码也在Windows上移植,因此对两者的建议都会有所帮助.

Ass*_*vie 20

如果可能,从main()到有问题的区域逐步执行,并按照执行路径执行.在此过程中,您将了解不同部分如何共同发挥作用.

使用静态代码分析工具(如CppDepends甚至Doxygen)来确定模块之间的关系并能够以图形方式查看它们也会很有帮助.

  • +1 Doxygen帮助我理解了代码库. (3认同)

Mac*_*cke 8

通常使用笔和纸,或图像/图形/图表来确定哪些部件属于哪里并绘制一些箭头等等.

这可以帮助您构建和查看图像,随着您对它的熟悉程度,这些图像将在您的脑海中得到完善.

我使用类似的方法来攻击一个地狱般的系统,这个系统有10个单身人士,彼此都是#include.为了适应一切,我不得不重新绘制几次,但在你面前看它有帮助.

在构造依赖图时使用Graphviz也可能很有用.这样你只需列出所有内容(在文本文件中)然后该工具将绘制(通常难看的)图片.(这就是我为上述系统中的#include依赖所做的事情)


Joh*_*web 6

正如其他人已经建议的那样,编写单元测试是进入代码库的好方法.这种方法有许多优点:

  1. 它允许您测试您对代码如何工作的假设.添加通过测试证明您对正在测试的那小段代码的假设是正确的.您编写的测试越多,您对代码的理解就越好.

  2. 当您修复错误并且知道您已成功完成时,将通过失败的单元测试来重现您要修复的错误.

  3. 您编写的单元测试将作为未来的文档.

  4. 由于修复了更多错误,因此单元测试您编写的回归测试.

当然,将单元测试添加到遗留代码并不总是一件容易的事.令人高兴的是,一位名叫Michael Feathers的绅士写了一本关于这个主题的优秀书籍,其中包括一些关于在没有单元测试的情况下为代码库添加测试的很好的"食谱".

WELC


bdh*_*har 5

一些指示:

  1. 从与工作流程更相关的部分进行调试.
  2. 使用调试字符串
  3. 获取适当的.pdb并将核心转储附加到Windbg或debugdiag等调试器中进行分析.
  4. 在您的组织中获得擅长调试的人员帮助.即使他不熟悉你的代码库,他也会非常乐于助人.我有过经验.他们会给你有价值的指示.
  5. 根据Per Assaf Lavie的建议,您可以使用静态代码分析器.
  6. 最重要的是:在您进行探索和调试时,随着进度记录所有内容.至少接替你的人会遭受更少的痛苦.