【问题标题】:g++ - is using the "-g" flag for production builds a good idea?g++ - 在生产环境中使用“-g”标志是个好主意吗?
【发布时间】:2012-06-11 22:23:10
【问题描述】:

只是为了提供一些上下文,我在这里谈论的是使用 g++ 编译 C++ 代码。

我可以看到在生产构建中包含 -g 标志将如何方便维护:如果程序意外崩溃,调试起来会容易得多。

我的问题是,包含 -g 标志是否会以任何其他方式影响输出可执行文件,而不是增加其大小?它能否以某种方式使代码变慢(例如通过关闭某些优化)?

据我了解,它不应该(文档只提到包含调试符号),但我不确定。

【问题讨论】:

    标签: c++ g++


    【解决方案1】:

    -g 标志不影响代码生成,仅更改符号表和调试元数据。这些并不存在于可执行代码部分,因此当代码在 hte 调试器之外运行时,它们甚至不会影响性能。

    【讨论】:

    • 代码安全性如何?保留调试器信息不会使二进制文件更容易泄漏信息吗?例如,在缓冲区溢出的情况下,系统可能会在其二进制文件中发送数据,如果该数据是调试信息,则可能就像发送源代码一样,这可能会导致进一步的调查和可利用的攻击。
    【解决方案2】:

    我记得读过某些优化是用调试符号关闭的:How Does The Debugging Option -g Change the Binary Executable?

    Googling 还会显示更多与此主题相关的帖子。

    我认为它不会真正影响到您,除非您的代码对性能非常敏感;而且,除此之外,我不知道有什么缺点(除了较大的二进制文件)。

    【讨论】:

    • 当我阅读这些文档时,只有 gcc 以外的编译器具有受 -g 影响的优化。我的经验是,对于 gcc,它走向另一个方向:您在调试器中可以看到和执行的操作会受到优化的影响 - 有时会很严重。当然,这是您对积极优化的期望:您无法调试不存在的内容。
    • @Gene:哦,我明白了……很有趣,感谢您指出。所以看起来我是那个对 GCC 有误解的人!
    【解决方案3】:

    我的问题是,包含 -g 标志是否会以任何其他方式影响输出可执行文件,而不是增加其大小?

    不,完全有可能生成优化的二进制文件带有调试信息,这不会以任何方式影响正常代码(尽管该信息可能不太有用,因为变量不需要存在于有时,内联函数更难调试等)

    Debian 发行版构建带有调试信息的软件包,这些信息稍后会被剥离(有时会拆分为“调试软件包”)。

    但请注意,尺寸增加可能会很大。

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 2015-12-10
      • 2016-03-28
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      相关资源
      最近更新 更多