启用核心转储是不是需要 gcc 的 -g?

Posted

技术标签:

【中文标题】启用核心转储是不是需要 gcc 的 -g?【英文标题】:Does enabling core dump require -g for gcc?启用核心转储是否需要 gcc 的 -g? 【发布时间】:2015-10-31 05:52:27 【问题描述】:

为了使正在运行的程序异常退出时能够创建核心转储,是否需要在编译期间为gcc指定调试选项-g?

【问题讨论】:

【参考方案1】:

不,您的程序将正常转储核心。然而,它将缺少调试符号,这意味着很难将核心转储与原始代码匹配。

【讨论】:

谢谢。没有-g,核心转储对调试没有用吗?那么核心转储可以用来做什么呢? 您仍然可以从核心转储中提取一些信息,但您无法将核心转储中的任何内容与源文件中的任何符号名称进行匹配。【参考方案2】:

不,这是两个不同的东西。然而,启用调试信息可能是一个好主意,因为它使核心转储更加有用。

如果您遇到可执行文件已发送给客户的情况,或者由于其他原因不想发送调试信息,那么您仍然想做的是使用 -g 标志进行构建,然后剥离调试来自可执行文件的信息并发布。

这样您最终会得到两个可执行文件,一个没有您发布的调试信息,一个带有您归档的调试信息。这将使您可以在/如果程序崩溃时分析核心转储。您只需将未剥离的可执行文件提供给调试器,而不是实际使用(剥离)的可执行文件。

如果您的构建过程是确定性的,另一种选择是归档源代码(例如通过使用修订控制系统)。然后您应该能够通过重建(现在使用 -g 标志)来创建调试信息。虽然这不是一个好主意,因为构建系统不是确定性的原因有很多 - 认为它更有可能从忘记 -g 标志的情况中恢复。

【讨论】:

以上是关于启用核心转储是不是需要 gcc 的 -g?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Address Sanitizer 和 gcc7.1.0 时如何生成核心转储

无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

sh 启用核心转储

linux下,gcc提示“段错误 (核心已转储)”,ubuntu刚上手不大会用,谁说一下是什么问题

在 C 中转储的分段故障核心

杀死进程而不创建核心转储?