在发布版本中保留调试符号有什么缺点吗?

13

我正在尝试确定在构建发布二进制文件时保留调试符号是否存在任何缺点。目前对于我们的发布版本,我们使用-O3进行编译,如果有任何崩溃,核心文件没什么用处。

因此,我想修改构建过程以保留调试符号,即-O3 -g,但是有些人持反对态度,因为他们认为可能会有一些影响(除了二进制文件大小)。我知道可以通过剥离符号来解决大小问题,但除此之外还有其他微妙的问题吗?


这是一个商业应用程序吗?您是否担心反向工程? - EboMike
@EboMike,不,这在我们的设置中不是一个适用的问题。 - Nim
2个回答

25

将符号与二进制分开。

g++ -ggdb -o target obj1.o obj2.o ...
strip target --only-keep-debug -o target.dbg
strip target

然后在gdb中使用symbol-file target.dbg

编辑:关于实际问题:

缺点是:

  • 更容易进行逆向工程(如果这让您担心)
  • 更大的二进制文件

执行速度不受影响-调试符号仅被添加到二进制文件的一个单独部分,它们可能会影响您的虚拟地址空间大小,但除此之外没有其他影响。


1
哇,太棒了,我不知道这是可能的! - speeder
谢谢,我知道这是可能的,问题更多的是在第一次构建优化版本时是否存在任何问题(即在剥离步骤之前)。 - Nim

0

它会影响大小,从而影响缓存和内存。

如果您阅读有关编译器选项的信息,您会发现有时展开循环等操作会使代码变慢,因为增加的大小会破坏缓存并导致更多的内存获取。


那么,将符号作为第二阶段操作剔除是否会降低缓存效果? - Nim
你是在提到Erik的想法吗?我认为是的。 - speeder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接