我遇到了有线分段故障。我正在使用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;
}
有人可以帮忙解释一下原因吗?
答案 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->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;
,至少你会停止泄漏。