核心转储不起作用

问题描述 投票:0回答:4

当我运行带有段错误的程序时,我收到一条错误消息分段错误: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

c macos segmentation-fault gdb coredump
4个回答
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
投票

如果您正在运行从 shell 崩溃的程序,那么您应该遵循 Apple 技术说明 TN2124 中的指南,我在 SO2207233 的答案中找到了该指南。

有几个要点:

  1. 您需要在
    ulimit -c unlimited
    中设置
    bash
    (效果相同,
    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。


0
投票

使用 gcc,如果添加标志:

gcc -g -dH

您应该能够生成核心转储

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


0
投票

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

sysctl -a | grep kern.core

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

© www.soinside.com 2019 - 2024. All rights reserved.