有时在我的工作中修改其他人的开源代码或了解如何为自己的应用程序开发特定的东西很有用。但是,并非所有软件都有良好的文档。
什么是理解代码库整体结构的好方法?
例如,哪些例程调用哪些例程等。我自己可能会为此目的使用文档工具(例如 Doxygen),但是,我想知道是否有更好的策略?
有时在我的工作中修改其他人的开源代码或了解如何为自己的应用程序开发特定的东西很有用。但是,并非所有软件都有良好的文档。
什么是理解代码库整体结构的好方法?
例如,哪些例程调用哪些例程等。我自己可能会为此目的使用文档工具(例如 Doxygen),但是,我想知道是否有更好的策略?
以下线程是切线相关的:
在我论文的第一部分,我花了 18 个月的时间修改未记录的 Fortran 代码,首要任务之一是尝试理解代码库的整体结构。我建议你做的最重要的事情是在你想出一些东西时在文本文件中做笔记。在这个耗时且令人沮丧的过程中,您不想重新学习或重新发现事物。
就我而言,没有“API”可言,因为函数的参数不是自记录的,因为以前的程序员使用类似 Fortran 77 的风格,因此,短标识符几乎没有暗示什么他们的意思。没有测试,因为它是 Fortran,所以没有标题。更有趣的是,这里和那里有几个用 C 或 C++ 编写的函数。
对我有用的东西(假设你在 Linux 中工作):
grep
. 学会爱grep
;您将在 shell 中使用它来查找函数的声明和调用位置,输出将告诉您要查看哪些文件。nm
. 如果您没有库的源代码,但想知道您遇到的函数是否在该库中,它可能对库很有用。但是,它仅在库的符号没有被剥离的情况下才有效。print
语句更有效。ddd
并且gdb
很棒,几乎可以在所有的 Linux 系统上使用。随意使用您最喜欢的调试器。我希望我早点想到的事情,或者对我来说不是选择:
gcov
和lcov
对代码的典型运行进行覆盖率分析。如果有示例应该执行大部分代码库,这两个工具结合起来会告诉你每行代码被访问了多少次。启用调试标志时最有用。如果代码的一部分根本没有被访问,那么立即理解它可能就不那么重要了。如果代码的一部分被大量访问,那么可能值得了解它是什么。也许代码被执行了很多,因为它是一个不重要的循环,或者它可能是许多其他函数所依赖的关键函数。您不能仅凭覆盖率分析来判断,但覆盖率分析可以让您了解将时间集中在哪里。splint
可以告诉您代码中是否有问题,例如某些变量从未使用过。dot
和一起使用graphviz
来生成调用图,并查看函数被调用的次数,例如覆盖率分析。对于复杂的代码,图形分析可能会更有帮助。我总是告诉我的学生从下往上阅读代码:你从 main() 开始,看看它调用了什么。通常这只是少数功能。然后查看从 main() 调用的函数,这些函数通常定义算法的整体流程(时间步进循环、汇编、求解器、输出等)。深入两层左右,从 30,000 英尺处获得算法的概览。其余部分通常可以从 doxygen 文档等中收集。
但正如我所说,信息是:从下往上阅读代码。