GCC调试,出现分段错误(核心已转储),但没有核心文件。

8
曾经我会遇到Segmentation Fault错误,但是没有生成核心文件。之后,我在编译命令中添加了-ggdb选项,并在执行gcc之前在bash中运行了以下命令:
ulimit -c unlimited

一开始都很好(我得到了一个核心文件),但现在我收到了“Segmentation Fault(core dumped)” 的错误,但是在执行gcc命令的目录中没有找到核心文件?它可能被放到其他地方了吗?我还能尝试什么?

一些额外的信息:

  1. 操作系统:Gentoo Linux
  2. 启用ELF核心转储已在运行的内核中启用。
  3. 应用程序是使用gtk+编写的文本编辑器。

答案: 我有两种方法找到它:

  1. find / -name "core" -ls
  2. 就像torek建议的那样:

    $ strace ./executable > output.txt 2>&1

    $ grep chdir output.txt


1
核心转储将位于运行进程的当前目录中。该进程是否执行了 chdir() 操作?如果是,则跟随其更改的目录。 - Jonathan Leffler
@Jonathan Leffler,感谢您的建议。该应用程序是使用gtk+编写的文本编辑器。我编写的源代码中没有chdir()函数。为了安全起见(以防gtk+源代码中有什么问题),我只打开了两个标签页,这两个文件都在同一个目录下(与可执行文件相同),但仍然没有核心转储文件产生。 - nomadicME
core(5)手册页面解释了如何控制何时和是否生成core文件。也许/proc/sys/kernel/core_pattern中的值指向不同的目录(我的系统管理员设置了我们的以在/tmp中生成唯一命名的文件)。 - tripleee
1个回答

8

如@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文件在那里。


非常感谢您的帮助。我在我的主目录中找到了核心文件。使用Strace显示执行了chdir()来切换到我的主目录。我需要进一步调查这个问题。再次感谢。 - nomadicME

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接