Linux中的核心转储

15

我希望在进程崩溃时创建核心转储。目前我正在遵循以下方法:

  1. 使用gcc / g ++的“-g”构建程序的特殊“调试”版本。
  2. 执行“ulimit -c无限制”
  3. 现在每当程序崩溃时,我们都会得到核心转储。

但是我想最小化步骤数量,以便:

  • 应始终创建核心转储。即使它是“发布”构建。用户不应被要求手动执行命令“ulimit -c无限制”。
  • 该核心转储的回溯应能够提供调用的文件、函数、行号。也就是以人类可读的形式呈现的堆栈跟踪。
  • 我不想使用“-g”构建程序。或者至少不应包含任何其他不需要生成人类可读堆栈跟踪的调试信息。因为这将是程序的发布构建。

所以我有两个问题:

  1. 如何在程序的“发布”构建中创建核心转储?
  2. 始终。无需手动执行“ulimit -c无限制
5个回答

11
  • 关于核心限制,您可以通过调用 setrlimit 在C中自行完成。
  • 在GNU (glibc)或BSD系统上,您可以通过调用backtrace和相关的系统调用获得回溯。之后,您需要通过运行addr2line(或重复其功能)将函数地址转换为函数名称。
  • 只需不使用-g,就可以获得回溯(除了内联函数不会出现)。

7
常规解决方案是使用-g选项进行构建,并在发布文件之前剥离调试信息。查找“strip”命令。 您可以保留带有调试信息的文件,用于调试从客户处获得的核心转储。
如果您想要在用户机器上打印可读的人类回溯信息,则需要分发带有(一些)调试信息的二进制文件。 在glibc中查找“backtrace()”函数。
请注意,即使您的二进制文件不包含调试信息,也将创建核心转储(如果ulimit适当设置)。
确保创建核心转储的最佳方法可能是从设置ulimit的脚本中执行二进制文件。

3
你可以尝试使用google-coredumper:
这是一个很棒的工具,可以从多线程应用程序中创建GDB可读的核心转储文件——而程序仍在运行。将coredumper库编译到应用程序中可以创建运行中程序的核心转储文件,而不会终止程序。

http://sourceforge.net/projects/goog-coredumper/


2
  1. 在Linux上,没有所谓的“发布”版本和“调试”版本。只需在使用“-g”时构建带有调试信息的程序。您可以剥离这些信息。

更新
实际上,在我的消息中我认为我应该提到一个可能的调试和发布版本之间的区别。发布版本可能会使用NDEBUG定义来摆脱程序中的所有assert()。相反,调试版本应该在不定义NDEBUG的情况下构建,因为assert()有助于查找错误。

但是如果您不使用assert(),则没有区别。

  1. 用户可以在其个人资料中设置ulimit -c无限制。

  2. 使用某些优化编译的程序的回溯通常不会给出有用的行号。

  3. 您可以构建带有调试信息的版本并将其放入存档中。然后剥离它并将已剥离的二进制文件交付给客户。如果客户向您提供核心文件,则只需使用具有调试信息的版本和来自客户的核心文件。

  4. 如何在“发布”构建的程序中创建核心转储? 这不是您的责任,而是操作系统的责任。


-4

如果代码是发行模式/高度优化版本,您几乎无法以人类可读的形式获得一个体面的Stacktrace。使用-g开关或完全忘记做Stacktrace……您不能两者兼得! 这就回到了这一点——看起来你甚至在生产环境中都预料到了代码会崩溃?

为什么不先修复代码并确保其正常运行呢......代码有异味....... 嗅嗅

编辑:好的,我在上面的评论中可能表现得有点严厉,我没有打算那样,为了读者的利益,我在这里包含了另一个问题的链接,在answer中,我使用信号创建了一个堆栈跟踪并重定向到一个文件。这将有助于OP的问题,并帮助他进行故障排除......


重要的是要明白,'-g' 和优化级别是完全无关的。 '-g' 表示将调试信息添加到二进制文件中。它并不意味着代码不会被优化。'gcc -g -O3 ...' 是一个完全合理的做法(需要理解代码可能会稍微难以调试)。 - Kristof Provost
嗯,因为有时崩溃很难复现。而且错误并不总是可以预测的,对吧? 那个时候我不想丢失信息。 - Sabya
即使进行了优化,堆栈跟踪通常似乎会给出正确的函数(如果不一定是正确的行)。它通常不会差太远。至少这是我的经验。 - MarkR
@Kristof:我当然知道,但你只有使用-g选项才能获得堆栈跟踪的真正好处。完全同意!这将更难解决... @Sabya,@MarkR:没关系...有时候特别是作为守护进程的进程,甚至很难追踪崩溃 - 资源匮乏/耗尽、内存、未关闭套接字等等...看看这里的代码... https://dev59.com/PEvSa4cB1Zd3GeqPgbFl#2177725 - 这可能会对你有所帮助... - t0mm13b

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