WinDbg快速故障应用程序退出的崩溃转储分析 我正在查看一个C++应用程序的崩溃转储,可以看到应用程序与FASTHOFFAILFATALAppAppExeX.

WinDbg快速故障应用程序退出的崩溃转储分析 我正在查看一个C++应用程序的崩溃转储,可以看到应用程序与FASTHOFFAILFATALAppAppExeX.,c++,windbg,dump,C++,Windbg,Dump,下面的堆栈框架表明存在未处理的异常ntdll!RcConsolidateFrames+0x6 我想知道你是否可以帮我指出正确的方向,如何跟踪异常发生的位置 msvcr120!abort+0x34 msvcr120!terminate+0x1e msvcp120!_Call_func$catch$0+0x13 msvcr120!_CallSettingFrame+0x20 msvcr120!__CxxCallCatchBlock+0xf5 ntdll!RcConsolidateFrames+0x6

下面的堆栈框架表明存在未处理的异常ntdll!RcConsolidateFrames+0x6

我想知道你是否可以帮我指出正确的方向,如何跟踪异常发生的位置

msvcr120!abort+0x34
msvcr120!terminate+0x1e
msvcp120!_Call_func$catch$0+0x13
msvcr120!_CallSettingFrame+0x20
msvcr120!__CxxCallCatchBlock+0xf5
ntdll!RcConsolidateFrames+0x6
msvcp120!_Call_func+0x14
msvcr120!_callthreadstartex+0x17
msvcr120!_threadstartex+0x102
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21

调用堆栈有两条线索<代码>$catch$和
终止
。这暗示了一个未捕获的异常,至少是代码未捕获的异常。这里有两个主要的案例需要考虑:要么你错过了一个处理程序,要么你无法捕捉到异常,因为它是从析构函数中抛出的。
为了区分这两种情况,可以在顶层为所有线程入口点添加自己的
catch(…){std::terminate();
}。这只会抓住第一个案例。如果同一调用堆栈继续发生异常,则应怀疑是析构函数。

调用堆栈有两条线索<代码>$catch$和
终止
。这暗示了一个未捕获的异常,至少是代码未捕获的异常。这里有两个主要的案例需要考虑:要么你错过了一个处理程序,要么你无法捕捉到异常,因为它是从析构函数中抛出的。
为了区分这两种情况,可以在顶层为所有线程入口点添加自己的
catch(…){std::terminate();
}。这只会抓住第一个案例。如果同一调用堆栈继续发生异常,您应该怀疑是析构函数。

调用设置框架()中似乎出现了问题,但如果没有符号文件,我认为您可能无法检索更多信息。顺便问一下,这是一个小的崩溃转储还是一个完整的内存转储?(这对这种特殊情况并不重要,但如果您的应用程序经常崩溃,则完整内存转储会提供更多信息,并有助于根本原因分析)小转储文件,无法再现崩溃,因此我只需要继续这一步。我会看看我是否能像你说的那样从CallSettingFrame()中得到更多我对此表示怀疑。运行
从来都不会有什么坏处!分析-v
和/或查看
.exr-1
相关:@LievenKeersmaekers:启用异步异常处理/EHa时,调用堆栈是这样的吗?否则我会期望堆栈上有更多的函数调用。看起来
callsetingframe()
中出现了一些错误,但是如果没有符号文件,我认为您可能无法检索更多信息。顺便问一下,这是一个小的崩溃转储还是一个完整的内存转储?(这对这种特殊情况并不重要,但如果您的应用程序经常崩溃,则完整内存转储会提供更多信息,并有助于根本原因分析)小转储文件,无法再现崩溃,因此我只需要继续这一步。我会看看我是否能像你说的那样从CallSettingFrame()中得到更多我对此表示怀疑。运行
从来都不会有什么坏处!分析-v
和/或查看
.exr-1
相关:@LievenKeersmaekers:启用异步异常处理/EHa时,调用堆栈是这样的吗?否则,我会期望堆栈上有更多的函数调用。