GDB 如何处理大(>1 Gb)调试文件?

How GDB deals with big (>1 Gb) debug files?

我在使用代码库很大的远程 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 需要大量内存才能扩展它?

提前致谢!

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

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

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