簡體   English   中英

程序崩潰與0xC000000D沒有例外 - 我該如何調試它?

[英]Program crashes with 0xC000000D and no exceptions - how do I debug it?

我有一個使用第三方庫的Visual C ++ 9 Win32應用程序。 當使用某組參數調用該庫中的函數時,程序將以“異常代碼0xC000000D”崩潰。

我試圖附加Visual Studio調試器 - 沒有拋出異常(既沒有C ++也沒有像訪問沖突那樣結構化),也沒有調用terminate() 程序仍然默默地結束。

程序如何異常結束但是沒有在調試器中停止會怎么樣? 我該如何本地化問題?

這是STATUS_INVALID_PARAMETER,使用WinDbg來追蹤是誰投擲它(即附加WinDbg, sxe eh然后g

對該問題的其他答案和評論幫助很大。 這就是我做的。

我注意到,如果我在Visual Studio調試器下運行該程序它只是靜默地結束,但是如果我在沒有調試器的情況下運行它會崩潰並顯示一個消息框(通常的Windows消息框說我丟失了未保存的數據,每個人都很抱歉)。

所以我在沒有調試器的情況下啟動了程序,讓它崩潰然后 - 當消息框仍然存在時 - 連接調試器並點擊“Break”。 這是調用堆棧:

ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0xc bytes   
kernel32.dll!_WaitForMultipleObjectsEx@20()  - 0x48 bytes   
kernel32.dll!_WaitForMultipleObjects@16()  + 0x18 bytes 
faultrep.dll!StartDWException()  + 0x5df bytes  
faultrep.dll!ReportFault()  + 0x533 bytes   
kernel32.dll!_UnhandledExceptionFilter@4()  + 0x55c bytes
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//OurCodeInvokingThirdPartyLibraryCode

很明顯,這是trird-party庫中的一些問題。 根據MSDN,在致命的情況下調用UnhandledExceptionFilter() ,顯然由於庫代碼中的某些問題而完成調用。 因此,我們首先嘗試與庫供應商一起解決問題。

如果您沒有第三方庫的源和調試信息,則無法使用調試器進入它。 在我看來,你的選擇是;

  • 將一個簡單的測試用例放在一起,說明崩潰並將其發送到庫開發人員
  • 在您自己的代碼中包裝該庫函數以檢查非法參數並在您自己的應用程序傳遞它們時拋出異常/返回錯誤代碼
  • 重寫庫中不起作用或使用替代方法的部分

很難修復僅作為對象提供的代碼

編輯您也可以使用__try __finally在主消息循環周圍更優雅地退出,例如

int CMyApp::Run() 
{
    __try
    {
        int i = CWinApp::Run();
        m_Exitok = MAGIC_EXIT_NO;
        return i;
    }
    __finally
    {
        if (m_Exitok != MAGIC_EXIT_NO)
            FaultHandler();
    }
}

暫無
暫無

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

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