【问题标题】:gcc debugging, Segmentation Fault (core dumped) but no coregcc 调试,分段错误(核心转储)但没有核心
【发布时间】:2023-04-11 11:21:01
【问题描述】:

以前我会得到没有内核的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. 按照托雷克的建议:

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

    $ grep chdir output.txt

【问题讨论】:

  • 核心转储将在运行进程的当前目录中。该过程是否完全执行chdir()?如果是这样,去它去的地方。
  • @Jonathan Leffler,感谢您的建议。该应用程序是一个用 gtk+ 编写的文本编辑器。我写的源代码中没有任何 chdir() 。为了安全起见(如果 gtk+ 源代码中有东西)我只打开了两个选项卡运行它,两个文件都在同一个目录中(与可执行文件相同),仍然没有核心。
  • core(5) 手册页解释了如何控制是否以及何时生成 core 文件。也许/proc/sys/kernel/core_pattern 中的值指向不同的目录(我的系统管理员设置我们在/tmp 中生成唯一命名的文件)。

标签: c debugging gcc


【解决方案1】:

正如@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

现在里面有一个 core.pid 文件。

【讨论】:

  • 也感谢您的帮助。我在我的主目录中找到了核心。使用 strace 它表明 chdir() 已执行到我的主目录。我将不得不进一步调查。谢谢。
猜你喜欢
  • 2020-09-08
  • 2015-06-25
  • 2021-06-03
相关资源
最近更新 更多