shell 为什么此处未生成Coredump文件?

p4rjhz4m  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(201)

我在这里遇到了一个问题,几天前我在目标板上看到了一个内核转储文件,我通过在/etc/profile中添加“ulimit -c unlimited”启用了内核转储生成。
但后来有人告诉我,这对从登录shell启动的程序有效,对 systemd 等启动的进程/服务无效,而且 * ulimit * 在另一个位置设置。
因此我更改了/etc/limits文件并添加了ulimit -c unlimited行,但仍然看不到核心转储文件。
我正在运行kill -9 $$以生成分段错误,它将依次生成核心转储文件,就像它之前所做的那样。
我们尝试更改“/proc/sys/kernel/core_pattern”文件并显式运行ulimit -c unlimited,但这还不够。
我们哪里走错了?

svgewumm

svgewumm1#

kill -9不会生成 core 文件。命令kill -l给出了支持的信号列表。kill -6kill -SIGABRT应该生成一个core文件。以及大多数其他 * 信号 *,如kill -BUSkill -SEGV等。

b91juud3

b91juud32#

kill -11总是对我有效。11是SIGSEGV(无效的内存引用)

kupeojn6

kupeojn63#

您必须首先启用用户限制设置,以确保可以创建核心转储文件。

ulimit -c unlimited

在同一会话中启动应用程序之前,应用程序用户必须以您的身份运行。此设置由应用程序继承,因此启动应用程序之前ulimit的设置就是应用程序的ulimit设置(除非启动脚本更改它)。

6rqinv9w

6rqinv9w4#

除了其他答案,您还可以使用gcore(1)生成某个 * 正在运行 * 的进程的 * 核心 * 转储。
但是如果使用kill(1)命令(或者底层的kill(2)系统调用,例如来自某个特定程序),我建议使用SIGABRTabort(3)在解除阻塞后发送给自己的信号),如signal(7)中所述。
请注意,程序通常可以禁止内核转储,例如通过调用setrlimit(2)并将RLIMIT_CORE设置为0,或者处理或忽略某些信号(例如sigaction(2) ...)。

相关问题