2009-01-23 73 views
2

我正在用C++編寫一個Win32服務。我有一個調用DebugBreak()(除其他外)的自定義Assert宏。當我在Vista下運行我的服務時,服務在到達DebugBreak()調用(一個int 3彙編操作碼)時崩潰,顯示vista崩潰對話框。錯誤代碼是80000003(硬編碼斷點)。爲什麼我的服務在Vista上DebugBreak()崩潰?

正常情況下,我期望在沒有調試器連接的情況下,我的服務運行在DebugBreak()調用上,而不需要執行任何操作。它爲什麼會崩潰?是否有可能改變設置以便繼續運行?

回答

5

它正在崩潰,因爲它是一個斷點例外。 爲了安全起見,您需要檢查是否連接了調試器:

if(:: IsDebuggerPresent()):: DebugBreak();

或使用try/except並返回1(異常執行處理程序與空處理程序)爲您的過濾器的斷點異常。

2

正常情況下,我期待我的服務運行在DebugBreak()調用上,而不需要在沒有調試器連接時執行任何操作。它爲什麼會崩潰?

MSDN Help for the DebugBreak function說,「如果進程不被調試,該函數使用一個標準的異常處理程序的搜索邏輯。在大多數情況下,這將導致調用進程,因爲未處理的斷點異常終止。」

是否有可能的設置更改以使其繼續運行?

您可以嘗試添加結構化異常處理程序。

或者,在調用DebugBreak之前檢查一些運行時標誌。

+0

當然這兩個答案都是正確的。感謝您的幫助,我不知道DebugBreak()會導致異常。 – vividos 2009-01-23 12:15:22