2008-12-18 84 views
7

我有一個用C++編寫的Windows應用程序,偶爾會蒸發。我使用蒸發這個詞,因爲沒有什麼遺留的東西:沒有「我們很抱歉」來自Windows的消息,沒有從Dr. Watson工廠的崩潰轉儲...如何調試意外終止靜默的win32進程?

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

如何捕獲此過程終止的原因?

+0

你怎麼知道應用程序沒有正常退出? – hova 2008-12-18 16:45:55

+0

兩個原因: 1.當正常退出時,應用程序會跳過幾個圈來正確關閉一些網絡連接的硬件。硬件在崩潰後仍在運行。 2.當應用程序正常退出時,調試會話結束。在這種情況下,它沒有。 – 2008-12-18 17:01:12

+0

你在你的問題中說應用程序線程已經終止,然後主進程循環退出。這聽起來像應用程序正常終止 - 並且'錯誤'可能是一個設計問題。檢查你的線程循環,看看他們爲什麼退出(中斷點)。 – Klathzazt 2009-02-03 14:57:02

回答

5

你可以嘗試使用在windows debugging tool package的ADPlus的工具。

adplus -crash -p yourprocessid 

自動轉儲工具爲異常提供小型轉儲,並在應用程序崩潰時提供完整轉儲。

1

您可以在Windows上檢查Windows日誌Event Viewer

+0

並讓您的服務登錄到事件日誌中...... – 2008-12-18 20:25:06

1

首先我想說的是,我只有對Windows開發一個適度的經驗。 之後,我認爲這是一個日誌可能有所幫助的典型案例。

通常調試和記錄提供正交信息。如果你的調試器無用,那麼日誌會幫助你。

2

嗯,問題是你得到訪問衝突。您可能想要附加WinDBG並打開所有的異常過濾器。它可能仍然沒有幫助 - 我的猜測是你得到的內存損壞不是拋出異常。

你可能想看看enabling full pageheap checking

你可能也想看看這個older question大約堆損壞對工具的一些想法。

4

如果您正在使用Visual Studio 2003或更高版本,您應該通過打開調試菜單下找到的所有調試異常中斷選項啓用調試器「第一次機會異常」處理功能|例外對話框。在調試器中開始進程的調試版本之前打開EVERY選項。

默認情況下,大多數調試器,這些第一次機會異常處理程序被關閉,因此,如果Windows或您的代碼拋出一個異常,調試器希望您的應用程序來處理它。

的第一次機會異常系統允許調試器攔截由所述進程和/或系統拋出EVERY可能的例外。

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

2

對這種突然消失的最常見的原因是堆棧溢出,通常是由某種無限遞歸的(其可以,當然,涉及幾個功能相互調用鏈)而引起的。

這是否是在您的應用程序的可能性?

3

發佈的所有其他想法都很好。

但它聽起來也像是在應用程序調用中止()或終止()。

如果您在調試器中運行它,請在這兩種方法上設置斷點,並使用exit()以獲得較好的度量。

以下是導致terminate to be called because of exceptions出錯的情況列表。

參見: Why destructor is not called on exception?

這表明,應用程序將終止()如果一個異常沒有被捕獲。因此,將main()中的catch塊報告錯誤(記錄到日誌文件),然後重新拋出。

int main() 
{ 
    try 
    { 
     // Do your code here. 
    } 
    catch(...) 
    { 
     // Log Error; 
     throw; // re-throw the error for the de-bugger. 
    } 
} 
1

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

0

您是否嘗試過PC Lint等並通過您的代碼運行它? 嘗試編譯最大警告 如果這是一個.NET應用程序 - 使用FX Cop。

0

可能的原因浮現在腦海。

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

最後一個在應用程序的立即失敗特定結果。
堆棧溢出 - 您可能會收到此通知,但不太可能。

放入調試器,將所有異常通知更改爲「總是停止」,而不是「如果不處理則停止」,然後執行您的操作來導致程序失敗。如果您遇到異常,調試器將停止,您可以決定這是否是您要查找的異常。

0

我花了幾個小時,試圖挖掘到這個運行在Windows 7 64位應用程序,我最後不得不設置在RtlReportSilentProcessExit功能,它生活在NTDLL斷點的Visual Studio 2017年。 dll文件。只有基本函數名稱足以讓Visual Studio找到它。

也就是說,我讓Visual Studio自動下載C標準庫的符號後,它也自動停止在導致問題的運行時異常。