我是 GDB 的初学者,我让它正常工作。但是,我想知道如何在大型项目中使用它。我有一个项目,其中使用 makefile 和 g++ 完成构建。为了让 GDB 工作,我们需要使用调试符号进行编译,对吧(g++ -g 文件)?
问题
- 我是否需要在 makefile 中创建一个新目标,比如“debug”,这样我就可以像make debug一样进行调试构建。这是最佳做法吗?
- 假设,我只需要调试 foo.cpp,除了构建包括 main 在内的整个程序之外,是否可以只为它生成调试符号?
有什么想法吗?
不需要,尽管您可能要考虑始终使用 -g 构建(有时,您甚至可能需要尝试调试优化的(-O1、-O2 等)代码;为什么不保留 -g?对于发布,您总是可以只需在二进制文件上运行 strip 。
是的。使用 -g 仅构建该文件。
我认为在大、中、小型项目中使用 gdb 并没有太大的区别。但是,对于大型项目,您必须考虑构建所需的空间量,因为调试信息会增加对象和可执行文件的大小。
在我工作的大型项目中,我们总是使用最详细的调试信息进行构建(例如,'-ggdb3' 用于本地 gdb 格式或 '-gdwarf-2 -g3' 用于访问 gdb 中的宏)。
完成调试后,我们只需使用“strip”命令从二进制文件中删除所有调试信息。
gcc -ggdb3 blah.c -o blah
strip blah
gdb 将在没有符号的情况下工作;只是输出的用处要小得多。
您始终可以将调试版本保存在某处,如果您需要重新绑定符号信息,则在调试剥离/发布版本后,您只需转到“文件/路径”,gdb 将重新读取符号那个目标。您也可以使用“symbol-file /path”来配置要绑定到剥离文件的符号信息。