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

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

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

为了提供一个小背景:我需要一个小的核心文件,原因有很多:我需要通过networking为大量(数千)客户端收集它们; 此外,这些是几乎没有SD卡的embedded式设备,以及用于networking连接的GPRS调制解调器。 所以超过200K的东西是没有问题的。

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

Solutions Collecting From Web of "最小核心转储(仅堆栈跟踪+当前帧)"

我用两种方法“解决”了这个问题:

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

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

现在,我很高兴有两个解决方案(这比什么都没有好..)我的下一步行动将是:

  • 看到有多困难将端口Breakpad到powerpc-linux:已经有powerpc-darwin和i386-linux所以..有多难? 🙂
  • 尝试使用谷歌coredumper转储只有几个页面周围目前的ESP(这应该给我当地人和参数)和“&some_global”(应该给我全局)周围。