我正在寫一個多線程程序,當拋出一個特定的異常時它會崩潰。已經剝離越來越多的代碼來發現問題,現在我只剩下一個非常簡單的案例,它會導致許多不同的崩潰之一,看起來是隨機的。我不知道爲什麼這樣做。多線程Win32 C++程序在多線程中使用try/catch崩潰
下面是節目的全部內容,因爲它主張:
#include <windows.h>
WINAPI DWORD threadFunc(LPVOID x) {
while (true) {
try {
throw 1;
} catch (...) {
}
}
return 0;
}
int main(int argc, char *argv[]) {
CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
Sleep(1000);
return 0;
}
據我所知道的,而試圖拋出程序崩潰,但不一定是第一次。
我得到在調試模式下的錯誤是:
- 賽格故障,帶有堆棧跟蹤,包括:
- 00403F70 _Unwind_SjLj_RaiseException(EXC = 0x474380)(../../../ GCC-4.4.1/libgcc中/../ GCC/unwind.inc:113)
- 00000000 0x004025f6在__cxa_throw()( - :??)
- 00401380的ThreadFunc(X =爲0x0)(d:\軟件Projects \ testcpp \ main.cpp:6)
- 7C80B729 KERNEL32!Ge tModuleFileNameA()(C:\窗口\ system32 \ kernel32.dll中:??)
- 00000000在00000000 ??()( - :??)
- 程序與代碼退出03
和運行沒有調試器:
- 「指令0X 東西在0X 別的引用的內存」,有時一次,有時兩次(presumabl y代表第二個線程)
- 「進程返回-1073741819(0000005)」,這是一個訪問衝突
- 「此應用程序已請求運行時終止它在一個不尋常的方式...進程返回3段(0x3) 「
對於在這樣短的程序中可能會導致所有這些不同的錯誤,我完全難住。註釋掉其中一個CreateThreads會阻止發生的任何錯誤,所以它似乎與多線程和異常拋出的交互有關。
我使用的是32位Windows XP SP3,和MinGW 4.4.1
更新
這個問題似乎一直在編譯器(一個錯誤,這是TDM-2的mingw32 4.4.1 - 在提問時我並不知道TDM元素,但我不認爲這有什麼區別)。相反,升級到版本4.6.1似乎一切正常。
感謝所有參與此問題的人。
http://www.mingw.org/Reporting_Bugs –