运行时出现分段错误,但调试成功

时间:2011-10-04 11:38:54

标签: c segmentation-fault

我遇到了有线分段故障。我正在使用Eclipse CDT在C中开发一个软件。当在终端上运行我的程序(Ubuntu 10,64bits)时,它只报告“分段错误”。但是,当我在Eclipse中使用gdb进行调试时,它会结束并且结果是正确的。

据我所知,分段错误可能有很多原因。我很抱歉我无法显示我的代码,因为我不知道问题出在哪里......

但是有人可以帮助我吗,是否有任何情况可能发生在我的情况下:终端上的分段故障,而调试很好?非常感谢。


谢谢,所有。我会花一些时间学习valgrind。我只是通过realloc()替换malloc()来修复bug。呼叫之后是两个memcpy。这是什么原因?以下是代码段:

bwa_seq_t *merge_seq (bwa_seq_t *s1, bwa_seq_t *s2) {
  ubyte_t *seq1, *seq2, *tmp;
  if (!s1 || !s2)
    return 0;
  seq1 = s1->seq;
  seq2 = s2->seq;
  tmp = (ubyte_t*) calloc (sizeof(ubyte_t), (s2->len + s1->len + 1));
  memcpy(tmp, seq1, sizeof(ubyte_t) * s1->len);
  memcpy(&tmp[s1->len], seq2, sizeof(ubyte_t) * s2->len);
  s1->len += s2->len;
  tmp[s1->len] = '\0';
  s1->seq = tmp;
  return s1;
}

有人可以帮忙解释一下原因吗?

7 个答案:

答案 0 :(得分:10)

请尝试以下步骤:

  • 在xterm中输入ulimit -c unlimited(这允许创建core / postmorterm文件)

  • 启动程序(让它崩溃):核心文件现在应该出现在目录中。

  • 使用gdb <yourprogram> <corefile>

  • 启动调试器
  • 在gdb提示符下键入bt以查看它崩溃的行。

  • (可选)更正错误。

答案 1 :(得分:6)

如果您知道如何从终端崩溃它,您可以创建一个核心文件,并检查它崩溃的点,如下所示:

$ ulimit -c unlimited   # to create a corefile
$ yourprogram
...
crash                   # this will create file "core" in the current directory
$ gdb yourprogram core  # shows the state at the moment of the crash

关于该主题的问题:

答案 2 :(得分:0)

这可能是未初始化变量的结果。 (在你的计划的第14行)

答案 3 :(得分:0)

编译调试信息并使用gdb识别使用转储发生错误的位置。

答案 4 :(得分:0)

您很有可能遇到某种未定义的行为。正如其他人已经说过的那样,使用Valgrind来调试这个问题。首先在Valgrind输出中查找INVALID READ,INVALID WRITE错误。当代码中发生错误时,它还会输出额外的调用堆栈。这应该有助于理解错误的原因。

答案 5 :(得分:0)

我之前也遇到过这个问题。不是在使用GCC编译器的Linux中,而是在Visual Studio 2005中。 就像,我的代码在调试模式下成功运行,而在发布(直接运行)模式下,它正在崩溃。事实是,当您调试代码时,调试器会处理Access违规,数组越界等异常,并且不会让代码崩溃。在直接运行模式下,没有人可以处理异常,因此代码会崩溃。

我建议您使用printf来显示中间操作结果,因为它是解决代码麻烦的最佳方法。

希望这会对你有所帮助..: - )

答案 6 :(得分:0)

顺便说一句:你在这里泄漏记忆。 s1-&gt; seq基本上被重新分配,但你忘了释放旧的内存。 变化:

s1->len += s2->len;
tmp[s1->len] = '\0';
s1->seq = tmp;
return s1;

成:

void *del; // <<--
s1->len += s2->len;
tmp[s1->len] = '\0';
del = s1->seq; // <<--
s1->seq = tmp;
free (del); // <--
return s1;

,至少你会停止泄漏。