【问题标题】:Core Dump is is not working核心转储不工作
【发布时间】:2012-08-14 18:27:56
【问题描述】:

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

【问题讨论】:

标签: c macos gdb segmentation-fault core


【解决方案1】:

看看这个链接:

选项包括:

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

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

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

  • 其他选项的“man core”

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

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

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

以上建议应该会有所帮助。请发回您找到的内容!

【讨论】:

  • 感谢您的链接!我正在使用 OSX,当我检查核心的手册页时,它说在 Darwin/Max OS X 下默认禁用转储以重新启用核心转储,特权用户必须编辑 /etc/launchd.conf ,但我在 /etc.. 下看不到那个文件?
  • @DanMoore - 查看这些链接:setting-environment-variables-in-os-xdeveloper.apple.com/library/mac/#technotes/tn2004/tn2124.htmlhow-to-enable-full-coredumps-on-os-x。请注意,/etc/launchd.conf 可能不存在。只需根据第一个链接的回复中的示例创建一个。
  • 成功了!我查看了您发送给我的第一个链接。我在 /etc 中创建了一个新的配置文件,写了 limit core unlimited 行,重新启动了我的 mac,现在我所有的 segfault 错误消息都说(核心转储)!核心文件本身可以在 /cores 中找到。谢谢!!
  • @DanMoore - 酷:谢谢你的好话!如果有效,请将此回复标记为“已接受”。
【解决方案2】:

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

有几个关键点:

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

【讨论】:

  • 这真的很有趣。为什么核心转储这么大?
【解决方案3】:

使用 gcc,如果添加标志:

gcc -g -dH

您应该能够生成核心转储

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

【讨论】:

  • 我使用 gcc -g -dH coredump.c 编译,但是当我运行 a.out 时,没有出现核心转储消息 :( 谢谢
  • 消息可能不会出现,但是否有一个名为 coredump.dSYM 的文件,或类似的文件
【解决方案4】:

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

sysctl -a | grep kern.core

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

【讨论】:

  • 当我在 bash 中键入该命令时没有任何反应 :( 感谢当前目录没有核心文件,我从根目录查看 /cores 目录,那里也没有任何内容。
  • grep kernel.core /etc/sysctl.conf ?
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2015-05-12
  • 2017-01-29
相关资源
最近更新 更多