【发布时间】:2012-06-11 22:23:10
【问题描述】:
只是为了提供一些上下文,我在这里谈论的是使用 g++ 编译 C++ 代码。
我可以看到在生产构建中包含 -g 标志将如何方便维护:如果程序意外崩溃,调试起来会容易得多。
我的问题是,包含 -g 标志是否会以任何其他方式影响输出可执行文件,而不是增加其大小?它能否以某种方式使代码变慢(例如通过关闭某些优化)?
据我了解,它不应该(文档只提到包含调试符号),但我不确定。
【问题讨论】:
只是为了提供一些上下文,我在这里谈论的是使用 g++ 编译 C++ 代码。
我可以看到在生产构建中包含 -g 标志将如何方便维护:如果程序意外崩溃,调试起来会容易得多。
我的问题是,包含 -g 标志是否会以任何其他方式影响输出可执行文件,而不是增加其大小?它能否以某种方式使代码变慢(例如通过关闭某些优化)?
据我了解,它不应该(文档只提到包含调试符号),但我不确定。
【问题讨论】:
-g 标志不影响代码生成,仅更改符号表和调试元数据。这些并不存在于可执行代码部分,因此当代码在 hte 调试器之外运行时,它们甚至不会影响性能。
【讨论】:
我记得读过某些优化是用调试符号关闭的:How Does The Debugging Option -g Change the Binary Executable?
Googling 还会显示更多与此主题相关的帖子。
我认为它不会真正影响到您,除非您的代码对性能非常敏感;而且,除此之外,我不知道有什么缺点(除了较大的二进制文件)。
【讨论】:
我的问题是,包含 -g 标志是否会以任何其他方式影响输出可执行文件,而不是增加其大小?
不,完全有可能生成优化的二进制文件带有调试信息,这不会以任何方式影响正常代码(尽管该信息可能不太有用,因为变量不需要存在于有时,内联函数更难调试等)
Debian 发行版构建带有调试信息的软件包,这些信息稍后会被剥离(有时会拆分为“调试软件包”)。
但请注意,尺寸增加可能会很大。
【讨论】: