6

我是 GDB 的初学者,我让它正常工作。但是,我想知道如何在大型项目中使用它。我有一个项目,其中使用 makefile 和 g++ 完成构建。为了让 GDB 工作,我们需要使用调试符号进行编译,对吧(g++ -g 文件)?

问题

  1. 我是否需要在 makefile 中创建一个新目标,比如“debug”,这样我就可以像make debug一样进行调试构建。这是最佳做法吗?
  2. 假设,我只需要调试 foo.cpp,除了构建包括 main 在内的整个程序之外,是否可以只为它生成调试符号?

有什么想法吗?

4

5 回答 5

2
  1. 不需要,尽管您可能要考虑始终使用 -g 构建(有时,您甚至可能需要尝试调试优化的(-O1、-O2 等)代码;为什么不保留 -g?对于发布,您总是可以只需在二进制文件上运行 strip 。

  2. 是的。使用 -g 仅构建该文件。

于 2009-04-26T07:41:57.953 回答
1

我认为在大、中、小型项目中使用 gdb 并没有太大的区别。但是,对于大型项目,您必须考虑构建所需的空间量,因为调试信息会增加对象和可执行文件的大小。

  1. 如果您最初低估了对整个解决方案进行调试的需要,那么您将来可能会因您的决定而受苦。无论是否有调试信息都可以完成构建总是好的,因此请仔细编写构建脚本。
  2. 是的,但请考虑我之前的回答。有时问题可能来自您没有调试信息的模块。
于 2009-04-26T07:48:59.123 回答
1

在我工作的大型项目中,我们总是使用最详细的调试信息进行构建(例如,'-ggdb3' 用于本地 gdb 格式或 '-gdwarf-2 -g3' 用于访问 gdb 中的宏)。

完成调试后,我们只需使用“strip”命令从二进制文件中删除所有调试信息。

gcc -ggdb3 blah.c -o blah
strip blah
于 2009-06-02T10:58:15.670 回答
0

gdb 将在没有符号的情况下工作;只是输出的用处要小得多。

  1. 这是一个偏好问题。我默认在调试模式下构建所有内容,并在必要时进行发布
  2. 是的。
于 2009-04-26T07:38:55.247 回答
0

您始终可以将调试版本保存在某处,如果您需要重新绑定符号信息,则在调试剥离/发布版本后,您只需转到“文件/路径”,gdb 将重新读取符号那个目标。您也可以使用“symbol-file /path”来配置要绑定到剥离文件的符号信息。

于 2009-07-14T03:20:28.300 回答