我有一个使用第三方库的Visual C ++ 9 Win32应用程序。当使用某组参数调用该库中的函数时,程序将以“异常代码0xC000000D”崩溃。
我尝试连接Visual Studio调试器 - 没有抛出异常(既不是C ++也不是类似于访问冲突的结构),也没有调用terminate()
。程序仍然默默地结束。
如果程序异常结束但没有在调试器中停止,该怎么办?我该如何本地化问题?
答案 0 :(得分:5)
这是STATUS_INVALID_PARAMETER,使用WinDbg来追踪是谁扔了它(即附上WinDbg,sxe eh
然后g
。
答案 1 :(得分:2)
对这个问题的其他答案和评论帮助很大。这就是我所做的。
我注意到如果我在Visual Studio调试器下运行该程序它只是静默地结束,但是如果我在没有调试器的情况下运行它会崩溃并显示一个消息框(通常的Windows消息框说我丢失了未保存的数据而且每个人都很抱歉)。
所以我启动了没有调试器的程序,让它崩溃然后 - 当消息框仍然存在时 - 连接调试器并点击“Break”。这是调用堆栈:
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_ZwWaitForMultipleObjects@20() + 0xc bytes
kernel32.dll!_WaitForMultipleObjectsEx@20() - 0x48 bytes
kernel32.dll!_WaitForMultipleObjects@16() + 0x18 bytes
faultrep.dll!StartDWException() + 0x5df bytes
faultrep.dll!ReportFault() + 0x533 bytes
kernel32.dll!_UnhandledExceptionFilter@4() + 0x55c bytes
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//OurCodeInvokingThirdPartyLibraryCode
很明显,这是trird-party库中的一些问题。根据MSDN,在致命的情况下调用UnhandledExceptionFilter()
,并且由于库代码中的某些问题,显然调用已完成。因此,我们将首先尝试使用库供应商解决问题。
答案 2 :(得分:1)
如果您没有第三方库的源和调试信息,您将无法使用调试器进入它。在我看来,你的选择是;
很难修复仅作为对象提供的代码
编辑您也可以在主消息循环周围使用__try __finally正常退出,例如
int CMyApp::Run()
{
__try
{
int i = CWinApp::Run();
m_Exitok = MAGIC_EXIT_NO;
return i;
}
__finally
{
if (m_Exitok != MAGIC_EXIT_NO)
FaultHandler();
}
}