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

时间:2009-04-26 07:13:47

标签: c++ makefile gdb

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

问题

  1. 我是否需要在makefile中创建一个类似“debug”的新目标,以便我可以进行类似 make debug 的调试构建。这是最好的做法吗?
  2. 假设,我只需要调试foo.cpp,是否可以仅为构建包括main的整个程序生成调试符号?
  3. 有什么想法吗?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

gcc -ggdb3 blah.c -o blah
strip blah

答案 2 :(得分:1)

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

  1. 如果您最初低估了整个解决方案的调试需求,您可能会在将来做出决定。在使用或不使用调试信息的情况下完成构建总是很好,因此请仔细编写构建脚本。
  2. 是的,但请考虑我之前的回答。有时问题可能来自您没有调试信息的模块。

答案 3 :(得分:0)

gdb可以在没有符号的情况下工作;只是输出的效果要小得多。

  1. 这是一个偏好问题。我默认在调试模式下构建所有内容,并在必要时执行 make release

答案 4 :(得分:0)

您可以随时将调试版本保存在某处,如果您需要重新绑定符号信息,在调试剥离/发布版本之后,您可以转到“文件/路径”并重新读取gdb该目标的符号。您还可以使用“symbol-file / path”配置要绑定到剥离文件的符号信息。