2

当我运行带有段错误的程序时,我收到一条错误消息Segmentation fault: 11。出于某种原因,我没有收到(核心转储)消息。我尝试运行 shell 命令ulimit -c unlimited,但我仍然得到同样的错误,它并没有说核心转储。我是 GDB 的新手,所以我用一个简单的程序进行了尝试:

/* coredump.c */
#include <stdio.h>
int main (void) {
  int *point = NULL;
  *point = 0;
  return 0;
}

但是当我使用编译时:

gcc coredump.c -g -o coredump

运行它,它仍然说segfault: 11

它是否仍在我不知道的地方创建核心转储?我希望能够使用gdb coredump core

4

4 回答 4

2

看看这个链接:

选项包括:

  • ulimit -c 无限制(默认 = 0:不生成核心文件)

  • 转储的目录必须是可写的。默认情况下,这是进程的当前目录,但可以通过设置 /proc/sys/kernel/core_pattern 来更改。

  • 在某些情况下,/proc/sys/fs/suid_dumpable 中的内核值可能会阻止生成内核。

  • 其他选项的“人核心”

  • find / -name core -print 2> /dev/null在文件系统中搜索核心文件

假设您正在运行 Linux,并且我假设您在具有写入权限的目录中执行 .exe。

所以我的前两个猜测是1)“ulimit -c unlimited”没有设置,或者被覆盖,或者2)核心文件正在生成,但是去“其他地方”。

上述建议应该有所帮助。请发回你找到的东西!

于 2012-08-18T17:06:09.783 回答
1

如果您正在运行从 shell 崩溃的程序,那么您应该遵循 Apple 技术说明TN2124中的指导方针,我在对SO2207233的回答中发现了这些指导方针。

有几个关键点:

  1. 您需要设置ulimit -c unlimitedbash相同的效果,不同的命令tcsh)。
  2. 您需要设置/cores目录的权限,以便您可以在其中创建文件。默认权限为 1775;您需要 1777。1 表示已设置粘性位。
  3. 然后创建核心转储,/cores并以 PID 为后缀(/cores/core.5312例如)。

如果您希望以图形方式启动的程序在崩溃时转储核心,那么您需要创建它(/etc/launchd.conf如果它不存在),并limit core unlimited在文件中添加一行。再次,请参阅技术说明中的信息以获取更多详细信息。


看它; 核心转储是巨大的!考虑这个不是很复杂或很大的程序:

#include <stdio.h>
int main(void)
{
    int *i = 0;
    int j = 0;
    printf("i = %d, j = %d, i / j = %d\n", *i, j, *i / j);
    return 0;
}

由此产生的核心转储接近 360 MB。

于 2012-08-19T00:08:41.957 回答
0

有时核心文件不存储在当前目录中,可能遵循不同的命名规则

sysctl -a | grep kern.core

可能会提示您的核心文件的存储位置

于 2012-08-18T17:07:13.520 回答
0

使用 gcc,如果添加标志:

gcc -g -dH

您应该能够生成核心转储

-g 标志产生一些与 gdb 一起使用的调试信息,并且 -dH 标志在出现错误时产生核心转储

于 2012-08-18T17:07:20.557 回答