当我运行带有段错误的程序时,我收到一条错误消息分段错误: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。
看这个链接:
选项包括:
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)核心文件正在生成,但是去“其他地方”。
以上建议应该有帮助。请回复您找到的内容!
如果您正在运行从 shell 崩溃的程序,那么您应该遵循 Apple 技术说明 TN2124 中的指南,我在 SO2207233 的答案中找到了该指南。
有几个要点:
ulimit -c unlimited
中设置bash
(效果相同,tcsh
中的命令不同)。/cores
目录的权限,以便可以在其中创建文件。默认权限为1775;你需要 1777。1 表示设置了粘性位。/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。
使用 gcc,如果添加标志:
gcc -g -dH
您应该能够生成核心转储
-g 标志生成一些与 gdb 一起使用的调试信息,-dH 标志在出现错误时生成核心转储
有时核心文件不存储在当前目录中,并且可能遵循不同的命名规则
sysctl -a | grep kern.core
可能会提示您的核心文件存储位置