1

我有一個處理異常很好的進程。它調用:Win32/C++的關閉異常處理

_set_se_translator(exception_trans_func); 
SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler); 
_set_purecall_handler(purecallHandler); 
set_terminate(terminateHandler); 
set_unexpected(unexpectedHandler); 
_set_invalid_parameter_handler(InvalidParameterHandler); 
atexit(exitHandler); //ignored during an expected exit 
_onexit(onexitHandler); //ignored during an expected exit 

無論何時發生異常,其中一個處理程序被調用,它會爲我創建一個故障轉儲。生活很好。

除了在一個客戶現場。當他們關閉進程時,出於某種原因沒有通過這些調用路由的異常,他們得到錯誤:

「0x101ba9df」處的指令引用「0x00000004」處的內存。內存不能被「讀取」。單擊確定以終止......」

x000000004的內存引用看起來像它可能是一個空指針,而且看那個地址出現是一個全球性的STL對象的析構函數(可能在CRT的initterm調用其中的全局被清理)。

現在我有點卡住,雖然,因爲我不能得到診斷轉儲和調用堆棧,看看到底是怎麼回事。所以....

爲什麼ISN」 t異常是通過上述處理程序發送的,而不是向用戶顯示?

有什麼方法可以隱藏該對話框(因爲此時沒有損害)?

有沒有一種方法來追蹤根錯誤?

感謝您的任何想法。

回答

2

他們運行什麼操作系統?

我假設你設置使用類似

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

,以確保Windows不與自己的錯誤處理跳躍在錯誤模式?

+0

這正是我所追求的:) – DougN 2009-11-27 14:04:18

+0

這實際上工作嗎?他上面描述的對話框聽起來像是一個CRT對話框,但您正在使用Win32 API調用 – 2009-11-28 02:13:38

1

這聽起來像CRT已經把一段SEH try/catch塊(不能正確寫入,Markdown踢)圍繞某段代碼,並捕獲異常來顯示消息,所以你永遠不會結束調用未處理的異常代碼路徑。你可能需要做一些CRT黑客來弄清楚發生了什麼。

1

這可能是STL代碼在程序關閉時全局變量被破壞期間執行的,也許(取決於您使用的STL版本)它需要的一些全局變量已經被銷燬。

我已經看到這與VS2008的STL。有些STL鎖對象是在啓動時通過文件級靜態創建的。

你在錯誤處理函數中使用STL嗎?這可能是其中的一個在程序關閉後期關閉並導致問題。

+0

有趣的想法。我在啓動時遇到了STL對象的一些問題,所以關機很有意義... – DougN 2009-11-27 14:04:53