从混合模式c++项目中的CLR-to-SEH异常中获取明智的信息

Getting sensible info from CLR-to-SEH exceptions in a mixed mode C++ project

本文关键字:获取 信息 异常 CLR-to-SEH c++ 项目 混合 模式      更新时间:2023-10-16

混合模式c++项目。本机代码正在调用托管代码。托管代码可能会抛出异常。我可以在本机模式下使用矢量异常处理程序捕获该异常;我可以看到它的PEXCEPTION_POINTERS。告诉代码0xE0434F4D,这意味着它是一个CLR异常,在那里。

问题:是否有任何方法可以从伴随数据中获得任何明智的信息(异常类,消息,堆栈跟踪等)?在ExceptionInformation中有一个参数,它看起来像一个指针…

不行,太晚了。你得到的只有异常代码。如果原始托管异常是由处理器故障引起的,那么您可能会在ExceptionInformation中得到一些信息。比如NullReference或者AccessViolation。这将没有帮助,因为您不再知道原始的SEH异常。使用COM给你一个更好的老鼠陷阱,CLR实现了IErrorInfo。但是你要运行的托管代码可能不是ComVisible。通过捕获Exception的托管存根调用代码可能是一个更好的角度。

这里也有类似的答案:
通过非托管代码捕获CLR异常

此问题已通过以下方式解决:

#import <mscorlib.tlb> raw_interfaces_only no_smart_pointers named_guids no_implementation
ATL::CComPtr< IErrorInfo > spErrorInfo;
ATL::CComPtr< mscorlib::_Exception > spCLRException;
ATL::CComPtr< mscorlib::_Exception > spCLRInnerException;
ATL::CComBSTR bstrCLRStackTrace;
ATL::CComBSTR bstrCLRMessage;
GetErrorInfo(0, &spErrorInfo)
spErrorInfo.QueryInterface(&spCLRException)
spCLRException->get_InnerException(&spCLRInnerException)
spCLRInnerException->get_StackTrace(&bstrCLRStackTrace)
spCLRInnerException->get_Message(&bstrCLRMessage)