核心转储已创建,但未写入文件?

Posted

技术标签:

【中文标题】核心转储已创建,但未写入文件?【英文标题】:Core dump is created, but not written to a file? 【发布时间】:2014-01-27 04:11:05 【问题描述】:

我正在尝试获取在嵌入式 linux 系统上运行的专有应用程序的核心转储,为此我编写了一些插件。 我所做的是:

ulimit -c unlimited
echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern
kill -3 <PID>`

但是,不会创建核心转储。 '/tmp/cores' 存在并且对每个人都是可写的,并且磁盘有足够的可用空间。当我以sleep 100 &amp; 作为示例进程尝试相同的操作然后将其终止时,就会创建核心转储。

我尝试了来自core manpage 的管道语法示例,它将一些参数和核心转储的大小写入一个名为core.info 的文件中。这个文件被创建了,而且大小大于0。那么如果创建了核心转储,为什么不写到/tmp/cores呢?可以肯定的是,我还在文件系统上搜索了 core* - 它不存在。 dmesg 没有显示任何错误(但如果我将核心转储传送到无效程序,它会显示)。

更多信息:该系统可能基于 Debian,但我不太确定。 GDB 以及许多其他工具不可用 - 只有busybox 用于基本的东西。 我正在尝试调试的进程在被终止后不久会自动重新启动。

所以,我想一种解决方案是修改示例程序,以便将转储写入文件,而不仅仅是计算字节数。但是明明有数据,为什么就不能正常工作呢?

【问题讨论】:

/var/cache/abrt 或 /var/crash 怎么样?有吗? 你的程序有信号处理程序吗? 看看***.com/questions/17965/generate-a-core-dump-in-linux/…。可能对你有帮助。 【参考方案1】:

如果您的专有应用程序调用setrlimit(2) 并将RLIMIT_CORE 设置为0,或者如果它是setuid,则不会发生核心转储。见core(5)。也许使用strace(1) 来找出答案。你可以安装gdb(也许通过[cross-]编译它)。另见gcore(1)。

另外,检查(并可能设置)调用 shell 中的限制。使用 bash(1) 使用 ulimit 内置。否则,cat /proc/self/limits 应显示限制。如果您没有bash,您可以在 C 中编写一个小包装器,然后调用 setrlimit 然后 execve ...

【讨论】:

以上是关于核心转储已创建,但未写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

JVM崩溃。如何获取错误日志或核心转储

Log4Net 正在创建文件但未写入文件

Chrome而非Firefox不会转储到SSLKEYLOGFILE变量

无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

数据流任务成功执行但未向 Excel 文件写入任何行

如何在崩溃模式下运行 adplus 但在关机时不写入转储?