为啥这里没有生成 Coredump 文件?

Posted

技术标签:

【中文标题】为啥这里没有生成 Coredump 文件?【英文标题】:Why Coredump files is not generating here?为什么这里没有生成 Coredump 文件? 【发布时间】:2013-08-21 10:12:46 【问题描述】:

我在这里有一个情况,几天前我能够在我的目标板上看到核心哑文件,我通过在我的 /etc/profile 中添加“ulimit -c unlimited”来提供核心转储生成支持。但是后来有人告诉我

这只会对从登录 shell 启动的程序生效,而不是对 systemd 启动的进程/服务,etc/limits 将是设置这些默认值的正确位置。

所以我更改了 /etc/limits 文件并添加了“ulimit -c unlimited”行。但现在我看不到 Coredumped 文件

我正在运行 kill -9 $$ 来生成分段错误,然后它会像之前一样生成 coredump 文件。

我们尝试更改“/proc/sys/kernel/core_pattern”文件并显式运行 ulimit -c unlimited,但也没有成功

我们哪里做错了??

【问题讨论】:

-9kill 命令是KILL 信号,将简单地终止进程而无需核心转储。 参见例如this question and answers. 另外,为什么要使用$$?它扩展为您正在运行的 shell 的 pid。 如果你使用的是 bash,你应该阅读the manual,上面写着:“在所有情况下,Bash 都会忽略 SIGQUIT。” Linux 内核可以在不支持core 的情况下进行配置。查看为您的 Linux 内核设置了 CONFIG_ELF_CORE。然后应用标准的用户空间信息。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

但这是个坏主意。一些奇怪的程序可能捕获 SIGSEGVSIGABRT 更传统,捕捉它的少数程序知道它的含义。【参考方案3】:

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

ulimit -c unlimited

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

【讨论】:

【参考方案4】:

除了其他答案之外,您还可以使用gcore(1) 生成一些正在运行的 进程的核心 转储。

但是如果使用kill(1) 命令(或底层的kill(2) 系统调用,例如来自一些临时程序),我建议使用SIGABRT(解除阻塞后abort(3) 发送给自身的信号),如记录在signal(7)。

请注意,程序通常可以禁止核心转储,例如通过调用setrlimit(2) 并将RLIMIT_CORE 设置为0 或处理或忽略某些信号(例如sigaction(2)...)。

【讨论】:

以上是关于为啥这里没有生成 Coredump 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥程序崩溃了,没有产生core文件

coredump导出堆内存

如何生成coredump文件

go 程序生成 coredump 文件

如何查询和修改Linux操作系统生成core dump文件的默认路径?

有时在配置的目录中没有生成 coredump 文件[关闭]