使用gdb进行调试 - 最佳实践

6

我是GDB的初学者并且已经成功使用了它。然而,我想知道在大型项目中如何使用它。我的一个项目是使用makefile和g++进行构建的。为了让GDB工作,我们需要开启调试符号,对吗(g++ -g files)?

问题

  1. 我是否需要在makefile中创建一个新的目标,例如“debug”,以便我可以像make debug这样制作调试版本。这是最佳实践吗?
  2. 假设我只需要调试foo.cpp,是否可能仅为其生成调试符号,而不是构建包括main在内的整个程序?

有什么想法吗?

5个回答

2
  1. 不是必须的,但你可以考虑总是使用 -g 编译选项(有时,你甚至需要尝试调试优化过的代码(-O1、-O2等),为什么不一直开启 -g 呢?对于发布版本,你可以在二进制文件上运行 strip 命令来去除符号信息)。

  2. 是的。使用 -g 编译选项只编译该文件。


“对于发布,您总是可以在二进制文件上运行strip命令”这句话是什么意思?你能解释一下吗? - Navaneeth K N
使用-g选项编译代码会比不使用-g选项得到的二进制文件要大一些,虽然无法轻松地添加调试符号,但我们可以使用strip命令轻松地将其删除。 Translated text: 通过使用-g选项编译代码,生成的文件会比没有使用-g选项的文件稍微大一些。虽然无法轻松地添加调试符号,但您可以使用strip命令轻松地删除它们。 - Mikeage

1
在我工作的大型项目中,我们总是使用最详细的调试信息进行构建(例如,对于本地gdb格式,使用“-ggdb3”,或者对于在gdb中访问宏,使用“-gdwarf-2 -g3”)。
当我们完成调试后,只需使用“strip”命令从二进制文件中删除所有调试信息。
gcc -ggdb3 blah.c -o blah
strip blah

1

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

  1. 如果您最初低估了整个解决方案的调试需求,那么您将很可能在未来遭受决策的痛苦。当构建脚本可以带或不带调试信息时,编写您的构建脚本时要小心。
  2. 是的,但请考虑我的先前回答。有时问题可能来自于您没有调试信息的模块。

0

你可以随时保存调试版本的文件,如果在剥离/发布版本调试后需要重新绑定符号信息,只需输入 "file /path" 命令,gdb 就会重新读取该目标的符号。此外,你还可以使用 "symbol-file /path" 命令将符号信息配置为绑定到剥离文件。


0

gdb可以在没有符号的情况下工作;只是输出结果比较无用。

  1. 这是个人偏好问题。我通常默认使用调试模式构建所有内容,需要时再使用make release
  2. 是的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接