如何包含 GDB 调试符号“破坏包”?

Posted

技术标签:

【中文标题】如何包含 GDB 调试符号“破坏包”?【英文标题】:How can including GDB debugging symbols 'break packages'? 【发布时间】:2009-10-28 09:51:49 【问题描述】:

当我在 Gentoo 上构建软件包时。我收到警告说'-ggdb3'标志可以'破坏包。

我还没有找到一个例子来证明这是真的。虽然我曾经发现一些在不同优化设置下崩溃的代码,但这与包含调试符号不同。

能否提供一个代码示例,该代码无需调试符号即可编译,并且不会与它们一起编译(或在运行时以其他方式出错)?

【问题讨论】:

【参考方案1】:

在“过去”中,我从 Scratch 系统构建了一个完整的 Linux,并为每个二进制文件进行了调试。当然,安装量要大得多,内存使用量也不太理想,但我从来没有遇到过任何问题,无论是在编译还是后续执行中。

很难证明是否定的,并且不能通过轶事来证明,但是将其作为第二台桌面/玩具服务器运行一年会让我得出结论,这确实不是问题。

我认为你得到的标志是一个标准的警告,如果你设置了未测试的 USE 标志,或者它不是真的要安装的,包将在 Gentoo 中给出。只要你知道标志是什么——在这种情况下,你似乎——并且你没有将它放在任何“关键任务”设置中(即,如果出现问题,你会受到指责)似乎是安全的忽略这些警告。

【讨论】:

在您的 CFLAGS 中留下 -Werror 确实会带来无穷无尽的麻烦,但这是另一回事 ;-) @Chris 我现在在 FreeBSD 上很开心,因为我发现 Gentoo 会带来无穷无尽的麻烦,但这也是另一个故事...... ;)【参考方案2】:

我从来没有因为包含调试符号而失败过一次测试(或者更少,包中断)。在处理PPC 时,我只被优化错误所困扰。

但是,您必须考虑要构建的内容。如果要将可执行文件复制到类似 initrd 的文件中,您通常希望将其剥离(或在没有调试符号的情况下编译),尤其是静态链接时。

【讨论】:

什么是 ppc?您不是指“按点击付费”吗? @Chris Huang-Leaver: refspecs.freestandards.org/LSB_1.3.0/PPC32/spec/book1.html(即 PowerPC .. 摩托罗拉那些聪明人想出的东西)? @tinkertim IC,我唯一能想到的就是这个***.com/questions/768588,我认为这是 Solaris 的编译器问题。 @Chris Huang-Leaver:很难判断 CC 是否真的是 gcc,或者它是如何在该问题中调用的。这个问题是以 linux 为中心的,尽管我并没有把 Solaris 作为一个被遗忘的孩子抛弃。 Solaris(但不是 OpenSolaris)在很多极端情况下都存在问题。【参考方案3】:

有时当你打开调试符号时,它实际上改变了编译器生成的代码,在这种情况下,总是有可能从“正确的代码”变成“不正确的代码”。

我不知道“-ggdb3”启用了哪些特定更改,但也许这就是您被警告的内容。

【讨论】:

对于 GCC、AFAIK 来说从来都不是这样

以上是关于如何包含 GDB 调试符号“破坏包”?的主要内容,如果未能解决你的问题,请参考以下文章

在 x86 上使用 GDB 而不调试符号?

GDB如何调试没有符号表(未加-g选项的编译)的程序

即使使用 -g 标志编译,gdb 中也没有调试符号

如何避免 GDB 中符号的命名空间前缀?

linux 下面怎么用gdb调试多个.c文件?

使用 GDB 在堆栈上打印符号