核心转储已创建,但未写入文件?
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 &
作为示例进程尝试相同的操作然后将其终止时,就会创建核心转储。
我尝试了来自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
...
【讨论】:
以上是关于核心转储已创建,但未写入文件?的主要内容,如果未能解决你的问题,请参考以下文章
Chrome而非Firefox不会转储到SSLKEYLOGFILE变量