【问题标题】:How GDB deals with big (>1 Gb) debug files?GDB 如何处理大 (>1 Gb) 调试文件?
【发布时间】:2015-04-07 11:48:02
【问题描述】:

我在使用代码库很大的远程 GDB 会话调试 C++ 应用程序时遇到问题,因此它包含(使用“-O2”、“-g”、“-DNDEBUG”标志编译时)带有调试信息的大文件(1.1 Gb)。

不幸的是,我不能在调试过程中只使用部分符号表,因为调试器总是会跳过应用程序的一部分,并且我无法在此处设置断点并在调试时查看代码。

作为这个问题的解决方案,我在连接到目标后执行以下命令:

symbol-file -readnow [path-to-file-with-debugging-info]

这会扩展完整的符号表。但在这种情况下,GDB 只是内存不足,达到 13 Gb 甚至更多的 RAM(而我的机器上只有 16 Gb 可用)。这个问题已经在GDB Wiki 中列出并且已知。

我的问题是在这种情况下如何处理 GDB,当我需要完整的符号表时,但 GDB 需要大量内存才能扩展它?

提前致谢!

【问题讨论】:

  • 部分符号表是 gdb 优化。如果它们不起作用,那么这是您应该提交的 gdb 错误。普通用户永远不需要-readnow——它更像是一个 gdb 开发人员选项和/或错误解决方法。

标签: c++ debugging gdb


【解决方案1】:

您可以尝试使用带有--compress-debug-sections=zlib 选项的黄金链接器。这将减少调试信息的大小。 gdb 从 7.0 版本开始可以读取压缩的调试信息。

【讨论】:

  • 感谢您的提示,但不幸的是我必须倾向于使用通用构建环境,并且不允许使用其他链接器/编译器/等。
【解决方案2】:

由于处理大型调试文件是 GDB 的弱点,因此在这种情况下,最佳方法是借助调试符号来减小 *.dbg 文件的大小,而不是针对所有应用程序模块,而仅针对那些实际需要调试的模块发生。

在这种情况下,使用 ~150 mb *.dbg 文件并使用 DS-5 调试器,我只需要 2.5 Gb RAM,这是可以接受的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2014-07-09
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多