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

我正在尝试获取在嵌入式 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 用于基本的东西。 我正在尝试调试的进程在被终止后不久会自动重新启动。

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

【问题讨论】:

标签: linux coredump


【解决方案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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2023-03-14
    • 2011-12-05
    相关资源
    最近更新 更多