我想了解一下核心转储是如何工作的。
我使用 test.c 文件生成核心转储:
#include <stdio.h>
void foo()
{
int *ptr = 0;
*ptr = 7;
}
int main()
{
foo();
return 0;
}
我编译用
gcc test.c -o test
当我运行 ./test 时,它给了我以下消息
Segmentation fault (core dumped)
My file
/proc/sys/kernel/core_pattern
包含:
|/usr/share/apport/apport %p %s %c %d %P
我检查了我是否有写入该目录的权限
/var/crash/
但在核心转储之后,该文件夹(/var/crash/)中没有任何内容。
我使用的是 Linux 版本 17.04。
你知道这里会出什么问题吗?
edit
我忘了提及我设置了限制:
ulimit -c unlimited
所以输出
ulimit -c
reads :
unlimited
我什至尝试按照他们说的去做here https://wiki.ubuntu.com/Apport在部分如何启用批准,所以我在前面加了一个井号
'problem_types': ['Bug', 'Package']
但尽管如此,在 /var/cash 中找不到核心转储
This http://www.fromdual.com/hunting-the-core链接包含一个清单,说明为什么未生成 coredump。添加下面的列表,以防链接将来无法访问。
- 核心将大于当前限制。
- 您没有转储核心(目录和文件)所需的权限。请注意,核心转储放置在转储进程的当前目录中,该目录可能与父进程不同。
- 验证文件系统可写并且有足够的可用空间。
- 如果工作目录中存在名为 core 的子目录,则不会转储任何 core。
- 如果名为 core 的文件已存在但具有多个硬链接,则内核将不会转储 core。
- 验证可执行文件的权限,如果可执行文件启用了 suid 或 sgid 位,则默认情况下将禁用核心转储。如果您具有文件的执行权限但没有读取权限,情况也是如此。
- 验证进程是否未更改工作目录、核心大小限制或可转储标志。
- 某些内核版本无法转储具有共享地址空间的进程(也称为线程)。较新的内核版本可以转储此类进程,但会将 pid 附加到文件名中。
- 可执行文件可能是不支持核心转储的非标准格式。每个可执行格式必须实现一个核心转储例程。
- 分段错误实际上可能是内核 Oops,请检查系统日志中是否有任何 Oops 消息。
- 应用程序调用 exit() 而不是使用核心转储处理程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)