簡體   English   中英

未處理的C ++異常中的DUMP

[英]DUMP in unhandled C++ exception

在MSVC中,如何使任何未處理的C ++異常(例如std :: runtime_error)崩潰我的發布編譯程序,以便它從異常拋出位置生成具有完整堆棧的轉儲?

我已經在AeDebug注冊表中安裝了NTSD,並且可以為內存訪問違規等事情生成良好的轉儲,所以這里的問題歸結為正確地崩潰程序,我想。

提前致謝。

我終於把它搞砸了。

  1. 使用set_terminate()函數為每個線程注冊一個處理程序
  2. 在main函數()中,使外部DLL(事件Windows')無法成功調用SetUnhandledExceptionFilter() 關於如何在此處執行此操作的精彩文章: http//www.debuginfo.com/articles/debugfilters.html#overwrite
  3. 至於手柄本身,它非常簡單:
void Terminate()
{
  OutputDebugStringA("Terminate\r\n");
  RaiseException(0xE0000010, EXCEPTION_NONCONTINUABLE, 0, 0);
}

像上面的例子一樣調用RaiseException()足以使進程崩潰並產生我想要的轉儲。

你知道,我遇到的問題是:

  1. IPHelper Windows API動態加載另一個Windows DLL
  2. 此DLL使用Windows自己的C運行時版本(MSVCRT而不是MSVCRT90)
  3. 新的C ++運行時在啟動時調用SetUnhandledExceptionFilter()來捕獲C ++異常。 由於最新的C ++異常過濾器是由set_terminate()調用句柄集的過程,因此我的句柄未被調用。

SetUnhandledExceptionFilterDebugBreak應該可以完成這項工作。

編輯:oops,重讀,你想處理未捕獲的C ++異常。 這樣做會有點麻煩 - 當你(通常)得到一個C ++異常時,它已經將堆棧解開回到處理程序的級別。 在調用catch之前,您沒有任何真正的方法可以知道拋出異常,但到那時堆棧已經解開。

查看使用Windows調試器。
Windbg - 用一個不錯的用戶界面包裝KD和NTSD。
另請查看Windows調試器附帶的ADPlus。

是一個開始學習如何使用它的好地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM