当我使用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核心。
答案 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}}
有几点要点:
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。
答案 2 :(得分:0)
有时核心文件不存储在当前目录中,可能遵循不同的命名规则
sysctl -a | grep kern.core
可能会提示核心文件的存储位置
答案 3 :(得分:0)
使用gcc,如果添加标志:
gcc -g -dH
您应该能够生成核心转储
-g标志产生一些用于gdb的调试信息,-dH标志在出现错误时产生核心转储