首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最小核心转储(堆栈跟踪+当前帧)

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

Stack Overflow用户
提问于 2012-01-12 14:13:26
回答 1查看 9.2K关注 0票数 12

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

此外,如果可能的话,我希望以编程的方式(从代码中)设置它。我看过man core提到的man core文件,但就我的目的而言,它的粒度太粗了。

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

编辑:我正在开发一个运行Linux2.6.24的嵌入式设备。处理器是PowerPC。不幸的是,powerpc-linux目前还不支持断板,所以google坏板不是一种选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-12 13:07:21

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

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

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

现在,我很满意有两个解决方案(这总比什么都没有好。)我的下一步将是:

  • 看看如何将突破板移植到powerpc-linux:已经有powerpc-达尔文和i 386-linux所以..。这有多难?:)
  • 尝试使用谷歌-核心服务器只在当前ESP周围转储几个页面(这应该会给我提供局部变量和参数)和"&some_global“(这会给我全局的)。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8836459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档