代码之家  ›  专栏  ›  技术社区  ›  sharptooth

程序崩溃,0xc00000d,没有异常-如何调试它?

  •  5
  • sharptooth  · 技术社区  · 15 年前

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

    我尝试附加VisualStudio调试器-没有抛出异常(既不C++也不结构化,如访问违规) terminate() 也不被调用。不过,节目还是安静地结束了。

    程序不正常地结束但没有在调试器中停止,这是怎么发生的?如何定位问题?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Ana Betts    15 年前

    这是StasuSUnValuIDy参数,使用WrnBG跟踪谁投掷它(即附加WinDbg, sxe eh 然后 g .

        2
  •  2
  •   sharptooth    15 年前

    对这个问题的其他回答和评论帮助很大。我就是这么做的。

    我注意到,如果我在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
    

    很明显,这是第三方图书馆的问题。根据MSDN, UnhandledExceptionFilter() 在致命的情况下调用,很明显,调用是由于库代码中的某些问题而完成的。所以我们会先和图书馆的供应商解决这个问题。

        3
  •  1
  •   SmacL    15 年前

    如果没有第三方库的源代码和调试信息,则无法使用调试器单步执行。在我看来,你的选择是;

    • 组合一个简单的测试用例来说明崩溃并将其发送给库开发人员
    • 将该库函数包装在自己的代码中,该代码检查非法参数,并在自己的应用程序传递这些参数时引发异常/返回错误代码
    • 重写库中不起作用或使用替代项的部分

    很难修复仅作为对象提供的代码

    编辑 你也可以在你的主消息循环中使用优雅的方法更优雅地退出。

    int CMyApp::Run() 
    {
        __try
        {
            int i = CWinApp::Run();
            m_Exitok = MAGIC_EXIT_NO;
            return i;
        }
        __finally
        {
            if (m_Exitok != MAGIC_EXIT_NO)
                FaultHandler();
        }
    }