2011-10-04 155 views
5

我遇到了有線分段錯誤。我正在用C++開發一個使用Eclipse CDT的軟件。在終端上運行我的程序時(Ubuntu 10,64位),它只是報告「分段錯誤」。但是,當我在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

棧和/或堆損壞的可能性較大。確保你在你的編譯器上啓用了完整的警告並處理所有的警告。對'printf'等錯誤的參數以及類似的東西都是需要注意的事情。 – Mat

+2

在[valgrind](http://valgrind.org/)下運行你的程序,問題可能會變得很明顯。 – Hasturkun

回答

9

嘗試以下步驟:

  • ulimit -c unlimited在xterm(這允許創建核心/ postmorterm文件)

  • 啓動程序(讓它崩潰):核心文件現在應該出現在目錄中。

  • 推出與gdb <yourprogram> <corefile>

  • bt調試器在gdb的提示,看它做了什麼行崩潰。

  • (可選)更正錯誤。

+0

這基本上是lsalamon的答案。 1分鐘後^^ –

+2

呃,是的。但是這個答案對我來說似乎更全面。 – Joy

0

這可能是未初始化變量的結果。 (在你的程序的第14行)

+0

爲什麼第14行,具體是? – Hasturkun

+2

我不得不猜測; OP沒有顯示任何相關的來源。 – wildplasser

0

使用調試信息進行編譯並使用gdb識別使用轉儲發生錯誤的位置。

0

這很可能是您遇到某種未定義的行爲。正如其他人所說,使用Valgrind來調試這個問題。首先在Valgrind輸出中查找INVALID READ,INVALID WRITE錯誤。當代碼中發生不好的事情時,它還會輸出額外的調用堆棧。這應該有助於瞭解錯誤的原因。

0

我以前也遇到這個問題。無法在Linux中使用GCC編譯器,但在Visual Studio 2005 有人喜歡,我的代碼成功運行在調試模式,而在釋放(直接運行)模式下,它漸漸崩潰。事實是,當你在調試代碼的調試需要照顧像訪問衝突,陣列例外的出界等。並且不讓代碼變得崩潰。在直接運行模式下,沒有人處理異常,因此代碼會崩潰。

我會建議你使用printf顯示中間運算結果作爲其是troubleshot代碼最佳途徑。

希望這會幫助你.. :-)

0

BTW:你在這裏泄漏內存。 s1-> 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; 

,而且至少你會停止泄漏。

相關問題