【问题标题】:Debugging using gdb - Best practices使用 gdb 进行调试 - 最佳实践
【发布时间】:2009-04-26 07:13:47
【问题描述】:

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

问题

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

有什么想法吗?

【问题讨论】:

    标签: c++ makefile gdb


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

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

    【讨论】:

    • 你所说的“对于发行版,你总是可以在二进制文件上运行 strip”是什么意思?你能解释一下吗?
    • sourceware.org/binutils/docs-2.16/binutils/strip.html 使用 -g,您的代码会比没有使用时大一些。没有办法轻松添加调试符号,但是您可以使用 strip 轻松删除它们。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在我在这里工作的大型项目中,我们总是使用尽可能详细的调试信息进行构建(例如,用于原生 gdb 格式的“-ggdb3”或用于访问 gdb 中的宏的“-gdwarf-2 -g3”)。

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

      gcc -ggdb3 blah.c -o blah
      strip blah
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          你总是可以将调试版本保存在某个地方,如果你需要重新绑定符号信息,在你调试剥离/发布版本之后,你可以去“文件/路径”并且 gdb 将重新读取该目标的符号。您也可以使用“symbol-file /path”来配置要绑定到剥离文件的符号信息。

          【讨论】:

            猜你喜欢
            • 2010-09-30
            • 1970-01-01
            • 2019-12-09
            • 2010-11-16
            • 1970-01-01
            • 1970-01-01
            • 2010-09-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多