我尝试向我的Win32 DLL添加向量异常处理,但对AddVectoredExceptionHandler
的调用永远不会返回。我只是得到了无用的<app name>.exe has stopped working
对话框。但是,如果我使用Visual C ++调试器调试dll,那么它确实有效,并且在适当的时候调用处理函数,一切都很好。
要明确,我在初始化DLL时添加处理程序,就像这样
OutputDebugString("before adding\n");
AddVectoredExceptionHandler( 1, VectoredExcepHandler );
OutputDebugString("after adding\n");
当没有通过调试器运行时,DebugView显示“添加前”而不是“添加后”。
处理程序本身如下所示:
static LONG CALLBACK VectoredExcepHandler( PEXCEPTION_POINTERS exInfo )
{
OutputDebugString("reached handler\n");
return EXCEPTION_CONTINUE_SEARCH;
}
哦,如果重要的话,我正在运行Vista Home 64.
事件查看器显示该错误是kernel32.dll中的访问冲突。
几乎可以解决问题的进一步发现:我发现如果我在处理程序中注释掉OutputDebugString
调用,那么错误就会消失。所以我猜有一些与OutputDebugString
不兼容的例外。显然,这不是我可能想要检查的常见问题之一,例如访问冲突和无效指令,因为如果我在调用OutputDebugString
之前检查这些异常代码,那么一切都很好。
答案 0 :(得分:4)
OutputDebugString
都会引发异常。因此,您的异常处理程序通过调用它会导致无限递归,这会导致堆栈溢出。有关详细信息,请参阅here。
在内部,调试字符串作为异常处理。 OutputDebugString使用DBG_PRINTEXCEPTION_C(定义为0x40010006)调用RaiseException,并将字符串地址和大小作为异常参数调用。