最小核心转储(堆栈跟踪+仅当前帧)

时间:2012-01-12 14:13:27

标签: linux gcc gdb coredump

我可以在Linux上配置进入核心转储的内容吗?我想获得类似Windows迷你转储的东西(应用程序崩溃时有关堆栈帧的最小信息)。我知道你可以使用ulimit设置核心文件的最大大小,但这不允许我控制核心内部的内容(即不能保证如果我将限制设置为64kb它会转储最后16页的堆栈,例如)。

另外,如果可能的话,我想以编程方式(从代码中)设置它。 我查看了/proc/PID/coredump_filter提到的man core文件,但对于我来说,它看起来太粗糙了。

提供一些上下文:我需要微小的核心文件,原因有很多:我需要通过网络收集它们,用于众多(数千)客户端;此外,这些是具有少量SD卡的嵌入式设备,以及用于网络连接的GPRS调制解调器。所以任何超过200k的东西都是不可能的。

编辑:我正在开发一个运行linux 2.6.24的嵌入式设备。处理器是PowerPC。不幸的是,powerpc-linux目前在breakpad中不支持 ,所以google breakpad不是一个选项

1 个答案:

答案 0 :(得分:6)

我已经通过两种方式“解决”了这个问题:

  1. 我为SIGSEGV安装了一个信号处理程序,并使用backtrace / backtrace_symbols打印出堆栈跟踪。我用-rdynamic编译了我的代码,所以即使在剥离调试信息后,我仍然会得到一个带有意义名称的回溯(同时保持可执行文件足够紧凑)。 我删除了调试信息并将其放在一个单独的文件中,我将使用strip将其存储在安全的地方;从那里,我将使用add22line从回溯(地址)保存的信息来了解问题发生的位置。这样我只需要存储几个字节。
  2. 或者,我发现我可以使用/ proc / self / coredump_filter来不转储内存(将其内容设置为“0”):只有线程和proc信息,寄存器,堆栈跟踪等都保存在核心中。请参阅this answer
  3. 中的详情

    我仍然丢失可能很珍贵的信息(全球和地方变量内容,参数......)。我可以很容易地找出要转储的页面,但遗憾的是没有办法为正常的核心转储指定“dump-these-pages”(除非你愿意去修补maydump()函数内核)。

    现在,我对2种解决方案感到非常满意(总比没有好......)我的下一步行动将是:

    • 看看将Breakpad移植到powerpc-linux会有多困难:已经有powerpc-darwin和i386-linux了。它有多难? :)
    • 尝试使用google-coredumper只转储当前ESP周围的几页(应该给我本地和参数)和“& some_global”(这应该给我全局)。