[c++] 我怎樣才能調試一個意外終止默認的win32進程?



Answers

如果您使用Visual Studio 2003或更高版本,則應打開調試器菜單下的所有調試異常中斷選項,啟用調試器“第一次機會異常”處理程序功能。 例外對話框。 在調試器中啟動進程的調試版本之前打開EVERY選項。

默認情況下,調試器中的大多數First Chance Exception處理程序都是關閉的,所以如果Windows或者您的代碼拋出異常,調試程序需要您的應用程序來處理它。

第一次機會異常系統允許調試程序截獲進程和/或系統拋出的每個可能的異常。

http://support.microsoft.com/kb/105675

Question

我有一個用C ++編寫的Windows應用程序,偶爾會消失。 我使用蒸發這個詞,因為沒有任何東西留下來:沒有“我們很抱歉”來自Windows的消息,沒有Dr. Watson設施的崩潰轉儲...

有一次崩潰發生在調試器下面,調試器沒有中斷 - 它顯示應用程序仍在運行。 當我手動暫停執行時,我發現我的進程不再有任何線程。

我怎樣才能捕捉到這個過程終止的原因?




想到可能的原因。

  • 了TerminateProcess()
  • 堆棧溢出異常
  • 處理異常時異常

最後一個特別是導致申請立即失敗。
堆棧溢出 - 你可能會得到這個通知,但不太可能。

進入調試器,將所有異常通知改為“總是停止”而不是“如果不處理就停止”,然後執行你的操作來導致程序失敗。 調試器將停止,如果你得到一個異常,你可以決定這是否是你正在尋找的異常。




這可能是對_exit()或某些Windows等價物的調用。 嘗試在_exit上設置斷點...




那麼,問題是你正在得到一個訪問衝突。 您可能想要附加WinDBG並打開所有的異常過濾器。 它可能仍然沒有幫助 - 我的猜測是你正在得到內存腐敗,沒有拋出一個例外。

你可能想看看啟用整頁堆檢查

您可能還想查看關於堆腐敗的舊問題 ,以獲取關於工具的一些想法。









Related