2011-06-06 88 views
8

我有一个用于Linux的C代码可执行文件。在使用-g -O和strip与仅使用-O编译时,是否存在缺陷

对于释放,我可以有两种选择:

之一是建立与-g -O3,条带调试(条-g)和发送输出作为释放。 二是直接用-O3编译发布。

如果我理解正确,第一个选项的优点是我可以在剥离之前使用该exe来进行远程调试或分析核心转储。

的问题是,如果在这个approachi.e任何缺点,是有运行与-g建设,然后

由于剥离时的性能开销。

+0

请记住,只要语义相同,允许优化重写代码;并且非常积极。因此,即使有调试信息,编译后的代码也可能与您的源代码非常匹配,从而使调试“具有挑战性”。查看GCC中各个单独优化开关的文档,了解可以更改多少代码。 – Carsten 2011-06-06 09:10:15

+0

谢谢。我意识到这个问题,但仍然比调试裸优化的可执行文件更容易进行调试。 – eran 2011-06-06 09:32:15

回答

8

使用-g没有运行时间性能命中。调试信息位于可执行文件的单独部分,如果您执行该文件,甚至不会加载该文件。

但是,如果你愿意,你可以分开调试信息和可执行文件(这仍然不会产生任何性能差异)。我的Gentoo Linux以这种方式处理它,原因是将所使用的磁盘空间减到最小,这使得我可以在小型快速磁盘上拥有所有二进制文件,同时仍然可以在单独的分区中保留从未使用过的调试信息。

objcopy --only-keep-debug foo foo.debug 
strip -g foo 

现在你有一个foo可执行文件和一个包含调试符号的foo.debug。

+0

在单独的分区上调试信息?漂亮的核心。 +1 – 2011-06-06 09:42:08

+0

@Hendel:在每一个更新,更快的磁盘技术的生命周期中,有一个短暂的时间,其中一个磁盘的价格足以容纳操作系统安装是痛苦的;-)另外,更小,更便宜的设备,这段时间越长越好,因为花式快速磁盘的成本比整体成本更高。 – 2011-06-06 10:04:36

+0

这个更具吸引力的优点是分发包只包含二进制文件,另一个包只包含调试信息。只有少数用户需要下载第二个,对于那些用户来说,它比下载单独的包含二进制+调试代码的代码要好得多。 – Juliano 2011-06-06 18:00:37

相关问题