为什么AddVectoredExceptionHandler会崩溃我的DLL?

时间:2014-09-03 00:24:32

标签: windows visual-c++ dll exception-handling

我尝试向我的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之前检查这些异常代码,那么一切都很好。

1 个答案:

答案 0 :(得分:4)

每当调用它时,

OutputDebugString都会引发异常。因此,您的异常处理程序通过调用它会导致无限递归,这会导致堆栈溢出。有关详细信息,请参阅here

  

在内部,调试字符串作为异常处理。 OutputDebugString使用DBG_PRINTEXCEPTION_C(定义为0x40010006)调用RaiseException,并将字符串地址和大小作为异常参数调用。