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

Lor*_*tté 9 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 ,因此google breakpad不是一个选项

Lor*_*tté 7

我以两种方式"解决"了这个问题:

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

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

现在,我很高兴有2个解决方案(它总比没有好......)我的下一个动作是:

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