【问题标题】:Minimal core dump (stack trace + current frame only)最小核心转储(仅堆栈跟踪 + 当前帧)
【发布时间】:2012-01-12 14:13:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不知道,答案可能在内核源代码中(因为没有相关的规范)。你为什么要问?对于当前的磁盘,64Mb 的核心转储限制仍然很小,并且很可能包含足够的信息。为什么需要将限制设置为像 64kb 这样的微小值。 ?
  • Google Breakpad 在包括 Linux 在内的所有平台上写入 minidump。
  • 我问是因为我使用的是嵌入式设备,它有一个小闪存盘,尤其是下载数据的 gprs 连接速度很慢。我希望它尽可能小!
  • 我会看看 Breakpad.. 以前从未听说过!我希望它适用于我的架构(我应该提到,我会编辑问题)
  • 很遗憾 google breakpad 不支持 powerpc-linux!

标签: linux gcc gdb coredump


【解决方案1】:

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

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

我仍然丢失了可能很宝贵的信息(全局和局部变量内容、参数..)。我可以很容易地找出要转储的页面,但不幸的是,没有办法为正常的核心转储指定“转储-这些-页面”(除非您愿意去修补内核中的 maydump() 函数)。

目前,我对有 2 个解决方案感到非常满意(总比没有好。)我的下一步行动是:

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

【讨论】:

  • 虽然 fork google-coredumper 并修改 WriteCoreDump 函数以转储特定页面/地址很简单.. 它不支持 powerpc :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2013-02-27
相关资源
最近更新 更多