程序崩溃与0xC000000D没有例外 - 我该如何调试它?

时间:2010-11-22 07:16:21

标签: c++ winapi debugging visual-c++

我有一个使用第三方库的Visual C ++ 9 Win32应用程序。当使用某组参数调用该库中的函数时,程序将以“异常代码0xC000000D”崩溃。

我尝试连接Visual Studio调试器 - 没有抛出异常(既不是C ++也不是类似于访问冲突的结构),也没有调用terminate()。程序仍然默默地结束。

如果程序异常结束但没有在调试器中停止,该怎么办?我该如何本地化问题?

3 个答案:

答案 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();
    }
}