核心转储不起作用

时间:2012-08-18 16:57:01

标签: c macos gdb segmentation-fault core

当我使用segfaults运行程序时,我收到错误消息 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核心

4 个答案:

答案 0 :(得分:2)

请看这个链接:

选项包括:

  • ulimit -c unlimited(默认= 0:没有生成核心文件)

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

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

  • 其他选项的“man core”

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

假设你正在运行Linux,而我假设你正在一个你有写权限的目录中执行.exe。

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

以上建议应该有所帮助。请回复你找到的内容!

答案 1 :(得分:1)

如果你正在运行从shell崩溃的程序,那么你应该遵循Apple的技术说明TN2124中的指导原则,我在{SO2207233的答案中找到了这些指南。 3}}

有几点要点:

  1. 您需要在ulimit -c unlimited中设置bash(同样的效果,tcsh中的不同命令)。
  2. 您需要在/cores目录上设置权限,以便在其中创建文件。默认权限是1775;你需要1777. 1表示设置了粘滞位。
  3. 然后在/cores中创建核心转储,后缀为PID(例如/cores/core.5312)。
  4. 如果您希望以图形方式启动的程序在崩溃时转储核心,那么您需要创建/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。

答案 2 :(得分:0)

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

sysctl -a | grep kern.core

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

答案 3 :(得分:0)

使用gcc,如果添加标志:

gcc -g -dH

您应该能够生成核心转储

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