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

Car*_*bon 4 c++ seh

早上好!

编辑:这不是重复,因为它特别适用于SEH,而不是代码级抛出的异常.

我正在使用SEH来捕获一些不可靠库引发的硬件错误.我想从catchall异常中获取更多信息.以下代码模拟了我正在做的事情.正如您所看到的,我正在使用boost的current_exception_diagnostic_information,但它只是吐出"没有可用的诊断信息". - 不是非常有帮助.

是否有可能至少获得在没有捕获到异常的情况下返回的终止代码?(在这种情况下为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;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 7

使用catch (...)您完全没有任何信息,无论是关于C++异常还是SEH.因此全球处理程序不是解决方案.

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

您编写的函数必须是本机编译的函数(不使用/ clr编译).它必须采用无符号整数和指向Win32 _EXCEPTION_POINTERS结构的指针作为参数.参数分别是对Win32 API GetExceptionCodeGetExceptionInformation函数的调用的返回值.

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