混合模式C++項目。本地代碼正在調用託管代碼。託管代碼可能會引發異常。我可以使用向量異常處理程序以純模式捕獲異常;我可以看到它的PEXCEPTION_POINTERS
。告訴代碼0xE0434F4D,這意味着它是一個CLR異常,在那裏。在混合模式C++項目中從CLR-SEH異常中獲取合理的信息
問題:有沒有什麼辦法從助理數據中獲取任何合理的信息(異常類,消息,堆棧跟蹤等)? ExceptionInformation
中有一個參數,它看起來像一個指向某個東西的指針...
混合模式C++項目。本地代碼正在調用託管代碼。託管代碼可能會引發異常。我可以使用向量異常處理程序以純模式捕獲異常;我可以看到它的PEXCEPTION_POINTERS
。告訴代碼0xE0434F4D,這意味着它是一個CLR異常,在那裏。在混合模式C++項目中從CLR-SEH異常中獲取合理的信息
問題:有沒有什麼辦法從助理數據中獲取任何合理的信息(異常類,消息,堆棧跟蹤等)? ExceptionInformation
中有一個參數,它看起來像一個指向某個東西的指針...
不,這太晚了。你得到的只是例外代碼。如果原始託管異常是由處理器故障引起的,則可能會在ExceptionInformation中獲得一些內容。像NullReference或AccessViolation一樣。這不會有幫助,因爲您不再瞭解原始SEH異常。使用COM爲您提供更好的鼠標陷阱,CLR實現IErrorInfo。但您嘗試運行的託管代碼可能不是[ComVisible]。通過捕獲Exception的託管存根調用代碼可能是一個更好的角度。
我將此帖發佈爲以下博文的精神回答 http://www.joelonsoftware.com/items/2008/09/15.html –
有類似的答案在這裏這個問題:
Catching a CLR exception through unmanaged code
這適用於以下方式解決:
#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)
不,那是爲時已晚。你得到的只是例外代碼。如果原始託管異常是由處理器故障引起的,則可能會在ExceptionInformation中獲得一些內容。像NullReference或AccessViolation一樣。這不會有幫助,因爲您不再瞭解原始SEH異常。使用COM爲您提供更好的鼠標陷阱,CLR實現IErrorInfo。但您嘗試運行的託管代碼可能不是[ComVisible]。通過捕獲Exception的託管存根調用代碼可能是一個更好的角度。 –
@HansPassant,沒有冒犯 - 但這不是一個評論,這是一個答案。做到這一點! –
每個人都喜歡快樂的答案。這不是一個快樂的答案。 –