一尘不染

Linux中的核心转储

linux

每当进程崩溃时,我都想创建一个核心转储。目前,我正在采用这种方法:

  1. 使用gcc / g ++的“ -g”构建程序的特殊“调试”版本。
  2. 执行“ ulimit -c unlimited”
  3. 现在,只要程序崩溃,我们就获得核心转储。

但我想减少步骤数,以便:

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

所以我有两个问题:

  1. 如何在程序的“发行版”中创建核心转储?
  2. 总是。无需手动执行“ ulimit -c unlimited

阅读 462

收藏
2020-06-07

共1个答案

一尘不染

通常的解决方案是使用-g进行构建,并在释放文件之前剥离调试信息。查找“ strip”命令。您将文件包含调试信息,并用它来调试从客户那里获得的核心转储。

如果要在用户机器上打印人类可读的回溯记录,则需要分发带有(某些)调试信息的二进制文件。在glibc中查找“ backtrace()”函数。

请注意,即使您的二进制文件不包含调试信息,也会创建核心转储(如果ulimit设置正确)。

确保创建核心转储的最佳方法可能是在运行二进制文件之前,通过设置ulimit的脚本执行二进制文件。

2020-06-07