过去我会在没有内核的情况下得到Segmentation Fault
,然后我将 -ggdb 添加到编译命令中,并在执行 gcc 之前在 bash 中执行此命令:
ulimit -c unlimited
一切都很好一段时间(我有一个核心),但现在我得到了Segmentation Fault (core dumped)
但在发出 gcc 命令的目录中没有核心? 会不会是去别的地方? 我还能尝试什么?
一些附加信息:
- 操作系统:Gentoo Linux
- 在正在运行的内核中启用启用 ELF 核心转储。
- 该应用程序是用gtk+编写的文本编辑器
答:我发现有两种方式:
-
find / -name "core" -ls
正如托雷克所建议的那样:
$ strace ./executable> output.txt 2>&1
$ grep chdir 输出.txt
正如@JonathanLeffler所指出的,核心转储位于当前目录中。
您可以使用strace
来查看进程是否完成了 chdir()。 不幸的是,strace
没有显示核心转储本身的去向,但是:
$ cat crash.c
int main(void) {
chdir("/tmp");
*(int *)0 = 0;
return 0;
}
$ cc -o crash crash.c
$ strace ./crash
execve("./crash", ["./crash"], [/* 53 vars */]) = 0
... [lots of libc trace stuff snipped] ...
chdir("/tmp") = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault
$ ls /tmp
现在有一个核心。PID文件在那里。