为什么 AddVectoredExceptionHandler 会使我的 DLL 崩溃?

JWW*_*ker 2 windows dll exception-handling visual-c++

我尝试将向量异常处理添加到我的 Win32 DLL,但对AddVectoredExceptionHandler永远不会返回的调用。我只是得到了无用的<app name>.exe has stopped working对话。但是,如果我使用 Visual C++ 调试器调试 dll,那么它确实可以工作,并且在适当的时间调用处理程序函数,一切都很好。

明确地说,我在 DLL 初始化时添加了处理程序,就像这样

OutputDebugString("before adding\n");
AddVectoredExceptionHandler( 1, VectoredExcepHandler );
OutputDebugString("after adding\n");
Run Code Online (Sandbox Code Playgroud)

当不通过调试器运行时,DebugView 显示“添加前”而不是“添加后”。

处理程序本身如下所示:

static LONG CALLBACK VectoredExcepHandler( PEXCEPTION_POINTERS exInfo )
{
    OutputDebugString("reached handler\n");
    return EXCEPTION_CONTINUE_SEARCH;
}
Run Code Online (Sandbox Code Playgroud)

哦,如果重要的话,我正在运行 Vista Home 64。

事件查看器显示该错误是 kernel32.dll 中的访问冲突。


进一步的发现几乎解决了这个问题:我发现如果我OutputDebugString在处理程序中注释掉调用,错误就会消失。所以我猜有一些与OutputDebugString. 显然它不是我可能想要检查的常见问题之一,例如访问冲突和无效指令,因为如果我在调用 之前检查这些异常代码OutputDebugString,一切都很好。

小智 5

OutputDebugString每次调用都会引发异常。因此,您的异常处理程序通过调用它会导致无限递归,这会导致堆栈溢出。请参阅此处了解更多详情。

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