我正在尝试在嵌入式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
?可以肯定的是,我还在文件系统上搜索了核心* - 它不在那里。 dmesg
没有显示任何错误(但如果我将核心转储管道传输到无效程序,则会发生错误。)
更多信息:系统可能基于Debian,但我不太确定。 GDB不可用,以及许多其他工具 - 只有busybox用于基本的东西。 我正在尝试调试的过程在被杀后不久就会自动重启。
所以,我想一个解决方案就是修改示例程序,以便将转储写入文件而不是仅计算字节数。但是,如果显然存在一些数据,为什么它不能正常工作?
答案 0 :(得分:0)
如果您的专有应用程序调用{{3}}并将RLIMIT_CORE
设置为0,或者它是setrlimit(2),则不会发生核心转储。见setuid。或许可以使用core(5)来查找。你可以安装gdb
(可能通过[交叉]编译它)。另请参阅strace(1)。
另外,检查(并设置)调用shell中的限制。使用gcore(1)内置ulimit
。否则,cat /proc/self/limits
应显示限制。如果您没有bash
,则可以在 C 中编写一个小包装,然后调用setrlimit
,然后execve
...