2012-06-09 37 views
1

我在我的C++代碼中有一個非常奇怪的錯誤。C++不需要的中止原因?

我必須告訴你這個故事才能理解整體。 我正在使用線程通過boost_thread庫。 主要方法使得一些初始化,啓動3-4線程,比等待永遠:

while(true) sleep(1); 

的所有線程的主要功能有一些趕上一個嘗試,一個包羅萬象的處理程序:

void do_work() { 
    try { 
    .. 
    } 
    catch (int ei) { 
    } 
    catch (...) { 
    log("General error"); 
    } 
} 

螺紋做各種任務,如

  • 執行與execv功能腳本,
  • 寫入數據庫sqlite庫,
  • 通過openssl庫與世界溝通。

有些時候,通常不會,但是相當頻繁地被煩人的程序終止。

當它應該時,一切都被正確地釋放和刪除,所以這不成問題。 我讓它產生了一個核心轉儲以便有機會調試問題。

有趣的部分,現在來這裏: 了GDB的回溯看起來是這樣的:

(gdb) bt 
#0 0x40281ae8 in raise() from /lib/libc.so.6 
#1 0x402830ec in abort() from /lib/libc.so.6 
#2 0x402830ec in abort() from /lib/libc.so.6 
#3 0x402830ec in abort() from /lib/libc.so.6 
#4 0x402830ec in abort() from /lib/libc.so.6 
#5 0x402830ec in abort() from /lib/libc.so.6 
#6 0x402830ec in abort() from /lib/libc.so.6 
#7 0x402830ec in abort() from /lib/libc.so.6 
#8 0x402830ec in abort() from /lib/libc.so.6 
#9 0x402830ec in abort() from /lib/libc.so.6 

無盡中止調用,我不知道是什麼導致它。 螺紋看起來是這樣的:

(gdb) info threads 
    4 Thread 490 0x402e7bf4 in nanosleep() from /lib/libc.so.6 
    3 Thread 489 0x4031b384 in accept() from /lib/libc.so.6 
    2 Thread 501 0x402e7bf4 in nanosleep() from /lib/libc.so.6 
* 1 Thread 486 0x40281ae8 in raise() from /lib/libc.so.6 

這也是有趣,因爲線程1是無盡的睡眠循環的主要功能。

我的問題: 我怎麼才能找出墮胎的原因(因爲我不能忽視它,如果我沒有弄錯)?

在論壇,IRC頻道和谷歌搜索 - 但仍然沒有。 本週前我陷入困境,所以任何信息都非常感謝!

非常感謝!

+1

你有沒有試過在abort('b abort')頂部插入一個斷點? – dave

+0

還沒有,我會的!謝謝:) 這是有點困難,因爲有些情況下,這個錯誤不會顯示幾天.. – Daniel

+0

這個程序聽起來像是一個非常好的候選人在valgrind下運行。如果發生堆損壞(例如,由於線程之間的競爭狀況),valgrind可能會導致您找到問題的根源。 –

回答

1

SIGABRT通常發送時,事情變得非常可怕,非常錯誤。他們可能很難追查,因爲堆棧可能會被丟棄。

從回溯看來,它看起來像是在運行一個剝離(可能是優化的)可執行文件。你有沒有試過編譯和鏈接-g,這樣,當你得到coredump時,你可以獲得更多的洞察力?

+0

是的,這是一個剝離的,我現在用符號等編譯它,以獲得更多的信息。當錯誤再次出現時,我會在這裏上傳新的回溯。但是我認爲它不會有太大的幫助,因爲中止函數不在我的代碼中,並且回溯已滿: – Daniel

+0

回溯可能完全消失,因爲我懷疑你已經丟棄了堆棧,可能是堆棧溢出。 –

+0

關於這個問題的任何解決方案,我真的需要它嗎? – lucifer