在开发过程中将调试符号附加到系统库的最佳实践?

Ale*_*ach 7 debugging arch-linux dpkg makepkg

我正处于项目的某个阶段,安装系统包的调试版本会非常方便。至少在 Ubuntu 上,将调试符号添加到库中是小菜一碟。实际上,每个包都有一个-dbg变体,可以提供有用的回溯所需的所有符号。

但是,我目前在 Arch linux 上,一般的共识是编辑用户makepkg.conf文件,将任何调试标志添加到(C|CXX|CPP|LD)FLAGS. 然后自己重​​新构建包,并用调试版本替换当前的优化版本。好吧,我想这对于“基于源的分发”来说已经足够公平了,但是很快就会变得乏味。

那么,将调试符号附加到系统包的最佳实践是什么?其他包装商是怎么做的?

我想我已经看到strip可以提取调试符号并将它们保存在外部文件中。是否有可能gdb在回溯期间获取这些符号文件,而系统应用程序甚至不费心去寻找它们?从包装商的角度来看,这是如何工作的?

这只是一个想法,但创造一个chroot发展的环境是一个好主意吗?(我有一个问题 atm,其中一个包的调试版本和发布版本之间存在 ABI 不兼容,这有点痛苦。链接到其共享库的所有内容也抱怨缺少符号,因此恢复为优化版本..)

gol*_*cks 4

如果您分发源代码包,(autotools)规范是默认编译调试符号。

我认为曾经主流的 Linux 发行版也将它们保留在二进制文件中;我对此可能是错的。有一种误解认为删除调试符号可以“优化”软件。事实并非如此。包含调试符号的唯一区别是文件在磁盘上占用的空间。它不会影响内存使用,因为它们在正常使用期间不会加载到内存中(因此,它也不会影响其他任何内容)。尝试分析已剥离和未剥离的二进制文件。他们是一样的。

将它们从发行版包中拆分出来的目的只是为了减小每个包的大小,以便整个安装的大小为 2.5 GB,而不是 3.8 GB 或其他大小。如果您的包被选择包含在官方存储库中,则发行版将从源代码中打包它。他们不会使用您预先制作的包,因此您现在执行此工作(创建单独的调试包)不会在这方面产生影响。

如果您独立地为各种发行版分发库二进制包,那么没有人会关心调试符号是否被编译进去,并且大多数使用该库进行编程的人都会需要它们。对于少数因某种奇怪原因而烦恼的人来说,无论如何,它们很容易被剥夺。

所以,如果你想听听我作为程序员和 Linux 用户的意见,请把它们留下来,至少现在是这样。明显关注“过早优化”——尤其是并非真正优化的过早优化——看起来并不好。换句话说,您问题的字面答案是“在开发过程中将调试符号附加到系统库的最佳实践是将它们编译为.”。

也就是说,当我试图确认我的信念时,我确实注意到了此页 WRT .deb 软件包,即从前它们总是被包含在内。由于您在标签中包含了 dpkg,因此它可能对您有用。