分段错误,无核心转储。

7
我在我的程序中一直得到一个分段错误,但没有生成任何核心转储文件。 ulimit显示一个无限的值,我已经执行了ulimit -c无限以确保它正常运行。有什么想法吗?

也许先展示一些代码? - Blood
1
在调试器中运行程序,这样当故障发生时就会触发断点。 - unwind
1
你确定你正在查看正确的位置吗?你在那个文件系统上有足够的空间吗? - Slava
@unwind 在调试器下运行程序并不总是可能的。此外,程序可能会偶尔崩溃,例如每周一次。祝你在调试器下抓住它。 - Slava
See: https://dev59.com/Dmsz5IYBdhLWcg3wrJ6-#18428840 https://dev59.com/AG025IYBdhLWcg3wNTAV#18428730 https://dev59.com/yHVD5IYBdhLWcg3wI36L - kenorb
显示剩余4条评论
4个回答

7
如果您的程序以root身份运行(或具有root权限),请检查以下内容: cat /proc/sys/fs/suid_dumpable 如果程序是守护进程,请检查以下内容: getsebool allow_daemons_dump_core 并允许守护进程转储核心: setsebool -P daemons_dump_core 1

1
我的 /proc/sys/fs/suid_dumpable 输出为 2,而且我找不到 getsebool。我该怎么办? - Alejandro Galera
@AlejandroGalera 来自 https://man7.org/linux/man-pages/man2/prctl.2.html 的内容:"在内核版本2.6.13和2.6.17之间,也允许值为2,这会导致任何通常不会被转储的二进制文件只能由root读取;出于安全原因,此功能已被删除。" - Oleg Neumyvakin

3

出现上述问题的原因可能有几个:

  • 没有目录写入权限
  • 程序更改了工作目录
    还要在其他位置查找core文件
  • 磁盘已满
  • ulimit参数在一个shell中设置,而程序在另一个shell或环境中启动

2
+program是一个守护进程,但OP更改了当前shell会话的ulimit设置。 - Slava

1
为了解决Shell会话问题,假设您不反对以root身份进行测试:
#ifdef DEBUG
    // Enable core dumps
    struct rlimit corelim;

    corelim.rlim_cur = -1;
    corelim.rlim_max = -1;

    if (setrlimit (RLIMIT_CORE, &corelim) != 0)
    {
        log_error ("Couldn't set core limit");
    }
#endif

-6

段错误通常发生在访问错误的内存地址时。很可能是由于资源未正确初始化导致的。例如,您可以使用Valgrind进行调试。


这如何解决未生成核心转储的问题? - us2012
分配内存的问题不是语法错误。 - Mihai8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接