2012-01-12 55 views
5

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

另外,如果可能的话,我想以编程方式(从代码)设置它。 我看过man core提到的/proc/PID/coredump_filter文件,但它对我的目的来说似乎过于粗糙。为了提供一个小背景:我需要小型核心文件,原因有很多:我需要通过网络为大量(数千)客户端收集它们;此外,这些是带有少量SD卡的嵌入式设备,以及用于网络连接的GPRS调制解调器。因此,大于200k的任何事情都不成问题。

编辑:我正在运行Linux 2.6.24的嵌入式设备上工作。处理器是PowerPC。不幸的是,PowerPC的Linux是目前在breakpad不支持,因此谷歌breakpad是不是一种选择

+1

我不知道,答案可能在于内核源代码(因为没有与此相关的规范)。你为什么要问?对于当前的磁盘,64Mb核心转储限制仍然很小,并且很可能包含足够的信息。为什么你需要将极限设置为64kb这样的小数值。 ? – 2012-01-12 14:18:56

+3

Google Breakpad在包括Linux在内的所有平台上编写小型转储程序。 – 2012-01-12 14:38:39

+0

我问,因为我正在使用一个嵌入式设备,它有一个小的闪存盘,尤其是一个缓慢的gprs连接来下载数据..我希望它尽可能小! – 2012-01-12 15:02:06

回答

5

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

  • 我为SIGSEGV安装了一个信号处理程序,并使用backtrace/backtrace_symbols打印出堆栈跟踪。我用-rdynamic编译我的代码,所以即使剥离了调试信息后,我仍然使用有意义的名称进行回溯(同时保持可执行文件足够紧凑)。
    我剥去了调试信息,并把它放在一个单独的文件中,我将它存储在安全的地方,使用strip;从那里,我将使用add22line与从回溯(地址)保存的信息来了解问题发生的位置。这样我只需要存储几个字节。我发现我可以使用/ proc/self/coredump_filter转储没有内存(设置其内容为“0”):只有线程和proc信息,寄存器,堆栈跟踪等保存在内核中。查看更多内容this answer
  • 我仍然失去可能是宝贵的信息(全局和局部变量的内容,params ..)。我很容易找出要转储的页面,但不幸的是,没有办法为普通的核心转储指定一个“dump-these-pages”(除非你愿意去修补内核中的maydump()函数)。

    现在,我与有2个解决方案非常满意(有总比没有好。)我的下一步行动将是:

    • 看到多么困难将端口Breakpad到PowerPC的Linux操作系统:已经有powerpc-darwin和i386-linux了......它有多难? :)
    • 尝试使用google-coredumper转储只有几个页面周围的当前ESP(应该给我当地人和参数)和“& some_global”(应该给我globals)。
    +0

    尽管fork google-coredumper并修改'WriteCoreDump'函数以转储特定页面/地址会很简单..它不支持powerpc :( – 2013-04-12 13:39:58