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