使用 -g 标志编译有什么缺点吗?

NG_*_*NG_ 2 c c++ debugging gcc gdb

GDB 文档告诉我,为了编译调试,我需要让我的编译器生成调试符号。这是通过指定一个“-g”标志来完成的。

此外,GDB 文档建议我始终使用“-g”标志进行编译。这听起来不错,我想这样做。

但首先,我想了解一下缺点。在生产代码中进行编译调试是否有任何处罚?

我最感兴趣的是:

  1. GCC 作为首选编译器
  2. 红帽 Linux 作为目标操作系统
  3. C 和 C++ 语言

(尽管也欢迎有关其他环境的信息)

非常感谢!

Bas*_*tch 5

如果您使用-g(在最近的 GCCClang 上可以与优化标志一起使用,例如-O2):

  • 编译时间较慢(链接将使用更多内存)
  • 可执行文件是一个更大的文件(请参阅elf(5)并使用readelf(1) ...)
  • 可执行文件带有很多关于你的源代码的信息。
  • 您可以轻松使用GDB
  • 一些有趣的库,比如 Ian Taylor 的libbacktrace,需要DWARF信息(例如-g

如果您不使用,-g则使用 GDB 调试器会更困难(但可能)。

因此,如果您将二进制可执行文件传输给不应该了解您的源代码是如何编写的合作伙伴,您需要避免 -g

另请参阅strip(1)strace(1)命令。

请注意,使用-g调试信息标志对OcamlRust也有效

附注。最近的 GCC(例如2021 年的GCC 10GCC 11)接受许多调试器标志。随着-g3您的可执行文件带有更多的调试信息(例如 C++ 宏及其扩展的描述),带有-g-g1. 当然,编译时间会增加,可执行文件的大小也会增加。原则上,您的GCC 插件(可能是 2021 年的Bismon,或 Linux内核源代码中的那些)可以添加更多调试信息。实际上,除非您可以改进调试器,否则您不会这样做。但是,GCC 插件(或某些插件#pragma)可以删除一些调试信息(例如,删除选定函数集的调试信息)。