2012-05-20 30 views
3

我有一個很奇怪的情況。 我正在C++中運行由Visual Studio 2010編程的IOCP服務器程序。Visual C++程序崩潰,但沒有生成轉儲文件。爲什麼?

它使用'minidump',所以當有像指針濫用這樣的邏輯錯誤時,程序崩潰與轉儲文件,所以我可以找出代碼中的崩潰點在哪裏。

有時(很少),程序崩潰,並且沒有轉儲文件。

什麼情況會使SetUnhandledExceptionFilter()不能正常工作? 有人知道這個問題嗎?我無法弄清楚。

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/ee416349%28v=vs.85%29.aspx – DumbCoder

回答

4

那麼,當然你不知道,因爲你沒有一個小型轉盤來看。當SetUnhandledExceptionFilter回調觸發時,您應該做到絕對最小值。這個過程處於危險的狀態。它墜毀。鎖可能被鎖定,堆鎖特別麻煩。你不能指望MiniDumpWriteDump()成功。

你需要的是一個小小的守衛進程,它等待一個命名的事件。儘早在main()函數中啓動它,並將它傳遞給進程ID。守護進程等待事件和進程句柄。在您的異常回調中,只需發出信號並立即睡眠很長時間。這喚醒了守衛進程,它會調用MiniDumpWriteDump()以及其他任何必要的信息讓您知道崩潰。並殺死你的主要程序。

+0

我不明白'MiniDumpWriteDump'如何有更多的機會從另一個進程運行時成功。如果鎖定被保持,那麼這些鎖定被保持。哪個進程嘗試訪問鎖定的資源並不重要。另外,由於'MiniDumpWriteDump'不是線程安全的,你註定要麼。除非你可以同步所有的線程(你不能,因爲你的程序處於不確定狀態),所以不能保證成功。你所說的話聽起來似乎是合理的,但並沒有提供一個理由說明爲什麼後衛過程會有更高的成功機會。 – IInspectable

+1

線程安全無關緊要,只有一個調用MiniDumpWriteDump()的線程。無論進程是否被破壞,基本調用如MDWD需要完成其作業所需的CreateFile()和HeapAlloc()等基本調用都可能會失敗。它是一個過濾器,如果你在進程中執行它,那麼你永遠不會看到不可能調試的非常糟糕的崩潰。好的,也許吧。 –

+0

感謝您的回覆。在這裏還是不太確信:如果一個進程被破壞以至於'CreateFile'失敗(糾正我,但是它會失敗,除非內核內存被破壞?),那麼你也可以爭辯說''SetEvent'會。基本上''HeapAlloc'也是如此,除非OOM失敗。我會假設MDWD在'preallocated'靜態數據上工作,但這也解釋了爲什麼它不是線程安全的。在技​​術性較差的說明中,您是否有一個在進程內解決方案可能沒有的情況下生成的小型轉儲程序? – IInspectable