Linux中的核心转储

Sab*_*bya 13 linux crash gcc coredump crash-dumps

我想在我的进程崩溃时创建核心转储.目前我正在遵循这种方法:

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

但我希望尽量减少步骤数量,以便:

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

所以我有两个问题:

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

F'x*_*F'x 11

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


Kri*_*ost 7

通常的解决方案是使用-g构建并在释放文件之前去除调试信息.寻找'strip'命令.您可以使用调试信息保留文件,并使用它来调试从客户处获得的核心转储.

如果要在用户计算机上打印人类可读的回溯,则需要使用(某些)调试信息来分发二进制文件.在glibc中查找'backtrace()'函数.

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

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