【问题标题】:program received signal SIGSEGV, segmentation fault程序收到信号 SIGSEGV,分段错误
【发布时间】:2013-06-03 09:31:21
【问题描述】:

我在多线程环境中运行一个程序,它有时会失败。当我用 gdb 尝试它时,它会出现以下错误。

程序收到信号 SIGSEGV,分段错误。

[切换到线程 0x7fff677b700 (LWP 2777)] 0x00007ffff7aa42b9 in c/mgmt.c:479 479 处的 process_incomplete_rows (resultset=0x507950) c/mgmt.c: 没有这样的文件或目录。

mgmt.c 文件在那里,此代码对于某些选项工作正常,但有 2 或 3 个选项会给出此错误。这个错误的原因可能是什么。它在编译或 coe 中的错误?还是在访问某些数据时出错?

【问题讨论】:

  • 在您的问题中添加代码,分段错误是运行时错误而不是编译时间,您可能会在编译时收到警告
  • 您可以在运行应用程序时使用Valgrind 获取更多信息,并为自己找到一种回溯的方法:(spin.atomicobject.com/2013/01/13/exceptions-stack-traces-c)。 Valgrind 会告诉你你在哪种情况下(写到对象的末尾,...)。

标签: c++ c linux multithreading unix


【解决方案1】:

这可能意味着您的 node 变量要么是 NULL 要么已损坏。在调试器中运行您的程序,从崩溃前的某个时间点逐步执行它,直到它看到您把它搞砸的地方。或者使用 Purify 或 Insure++ 等自动化工具之一为您追踪。

【讨论】:

    【解决方案2】:

    分段错误是一种运行时错误,通常是由于引用了无效的指针。通常,该无效指针从未被初始化,但有时它会重用旧指针或写入已分配内存块的末尾(例如字符串末尾)。

    【讨论】:

    • 在我的情况下,它是由于参考问题引起的?因为它显示 79 c/mgmt.c: No such file or directory.
    • 根据报错信息,是c/mgmt.c文件第479行有问题。该行周围的代码是什么?
    • if (node->result_row)。其中节点是一个结构。
    • @user2298595 如果您发布更多代码会更好。但是你确定那个节点不为空吗?
    • 那么node 是一个无效的指针。代码很可能正在处理一组结果,并且未能检测到没有更多结果。使用调试器来探索代码是如何工作的,以及为什么节点会得到一个无效的值。如果您不知道如何使用调试器,那么这是学习的好时机。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多