通过 catch(...) 从 SEH 异常中获取有意义的信息?

Get meaningful information from SEH exception via catch(...)?

早上好!

编辑:这不是重复的,因为它专门与 SEH 有关,而不是代码级抛出的异常。

我正在使用 SEH 来捕获一些不可靠的库抛出的硬件错误。我想从 catchall 异常中获取更多信息。下面的代码模拟了我在做什么。如您所见,我正在使用 boost 的 current_exception_diagnostic_information,但它只是吐出 "No diagnostic information available." - 不是很有帮助。

是否有可能至少获得如果未捕获异常会返回的终止代码? (在本例中为 0xC0000005,访问冲突)

#include "stdafx.h"
#include <future>
#include <iostream>
#include <boost/exception/diagnostic_information.hpp>

int slowTask()
{
    //simulates a dodgy bit of code
    int* a = new int[5]();
    a[9000009] = 3;
    std::cout << a[9000009];
    return 0;
}

int main()
{
    {
        try
        {
            std::future<int> result(std::async(slowTask));
            std::cout<< result.get();
        }
        catch(...)
        {
            std::cout << "Something has gone dreadfully wrong:"
                << boost::current_exception_diagnostic_information()
                << ":That's all I know."
                << std::endl;
        }           
    }

    return 0;
}

使用 catch (...) 你根本得不到任何信息,无论是关于 C++ 异常还是 SEH。所以全局处理程序不是解决方案。

但是,只要您还使用 set_se_translator(),您就可以通过 C++ 异常处理程序 (catch) 获取 SEH 信息。 catch 的类型应该与编译器中构建和抛出的 C++ 异常相匹配。

The function that you write must be a native-compiled function (not compiled with /clr). It must take an unsigned integer and a pointer to a Win32 _EXCEPTION_POINTERS structure as arguments. The arguments are the return values of calls to the Win32 API GetExceptionCode and GetExceptionInformation functions, respectively.

或者你可以使用__try/__except,这是SEH特有的。它们可以在 C++ 中很好地使用,包括在使用 C++ 异常的程序中,只要您在同一函数中没有 SEH __try 和 C++ try(以捕获两种类型的异常在同一块中,使用辅助函数)。