我在这里遇到了一个问题,几天前我在目标板上看到了一个内核转储文件,我通过在/etc/profile中添加“ulimit -c unlimited”启用了内核转储生成。
但后来有人告诉我,这只对从登录shell启动的程序有效,对 systemd 等启动的进程/服务无效,而且 * ulimit * 在另一个位置设置。
因此我更改了/etc/limits文件并添加了ulimit -c unlimited
行,但仍然看不到核心转储文件。
我正在运行kill -9 $$
以生成分段错误,它将依次生成核心转储文件,就像它之前所做的那样。
我们尝试更改“/proc/sys/kernel/core_pattern”文件并显式运行ulimit -c unlimited
,但这还不够。
我们哪里走错了?
4条答案
按热度按时间svgewumm1#
kill -9
不会生成 core 文件。命令kill -l
给出了支持的信号列表。kill -6
或kill -SIGABRT
应该生成一个core文件。以及大多数其他 * 信号 *,如kill -BUS
、kill -SEGV
等。b91juud32#
kill -11总是对我有效。11是SIGSEGV(无效的内存引用)
kupeojn63#
您必须首先启用用户限制设置,以确保可以创建核心转储文件。
在同一会话中启动应用程序之前,应用程序用户必须以您的身份运行。此设置由应用程序继承,因此启动应用程序之前ulimit的设置就是应用程序的ulimit设置(除非启动脚本更改它)。
6rqinv9w4#
除了其他答案,您还可以使用gcore(1)生成某个 * 正在运行 * 的进程的 * 核心 * 转储。
但是如果使用kill(1)命令(或者底层的kill(2)系统调用,例如来自某个特定程序),我建议使用
SIGABRT
(abort(3)在解除阻塞后发送给自己的信号),如signal(7)中所述。请注意,程序通常可以禁止内核转储,例如通过调用setrlimit(2)并将
RLIMIT_CORE
设置为0,或者处理或忽略某些信号(例如sigaction(2) ...)。