Windows调用上的已处理异常可以终止()吗?

时间:2018-07-08 15:33:11

标签: c++ windows crash-dumps

我在Azure的Windows服务器VM上部署了C ++应用程序。

运行了好几天,然后WER进行了故障转储。错误的线程具有以下堆栈跟踪:

00 0000004a`7fb7ac00 00007ffa`9505e15f ucrtbase!abort+0x4e 
01 0000004a`7fb7ac30 00007ffa`911239ba ucrtbase!terminate+0x1f 
02 0000004a`7fb7ac60 00007ffa`9112c710 VCRUNTIME140!__std_terminate+0xa 
03 0000004a`7fb7ac90 00007ffa`9112282a VCRUNTIME140!_CallSettingFrame+0x20 
04 0000004a`7fb7acc0 00007ffa`91121b82 VCRUNTIME140!__FrameUnwindToState+0x136 
05 (Inline Function) --------`-------- VCRUNTIME140!__FrameUnwindToEmptyState+0x7e 
06 0000004a`7fb7ad30 00007ffa`9112be80 VCRUNTIME140!__InternalCxxFrameHandler+0x19a
07 0000004a`7fb7ad90 00007ffa`9897a5cd VCRUNTIME140!__CxxFrameHandler+0x90 
08 0000004a`7fb7ade0 00007ffa`9891068a ntdll!RtlpExecuteHandlerForUnwind+0xd 
09 0000004a`7fb7ae10 00007ffa`9112c249 ntdll!RtlUnwindEx+0x38a 
0a 0000004a`7fb7b4f0 00007ffa`91122979 VCRUNTIME140!_UnwindNestedFrames+0x109 
0b 0000004a`7fb7bab0 00007ffa`91122090 VCRUNTIME140!CatchIt+0xb5 
0c 0000004a`7fb7bb30 00007ffa`91121c7e VCRUNTIME140!FindHandler+0x3f0 
0d 0000004a`7fb7bc00 00007ffa`9112be80 VCRUNTIME140!__InternalCxxFrameHandler+0x296 
0e 0000004a`7fb7bc60 00007ffa`9897a54d VCRUNTIME140!__CxxFrameHandler+0x90 
0f 0000004a`7fb7bcb0 00007ffa`9890fcf3 ntdll!RtlpExecuteHandlerForException+0xd 
10 0000004a`7fb7bce0 00007ffa`98911a09 ntdll!RtlDispatchException+0x373 
11 0000004a`7fb7c3e0 00007ffa`95c53c58 ntdll!RtlRaiseException+0x2d9 
12 0000004a`7fb7cbc0 00007ffa`91124572 KERNELBASE!RaiseException+0x68
13 0000004a`7fb7cca0 00007ffa`784bd3ce VCRUNTIME140!_CxxThrowException+0xc2 
14 0000004a`7fb7cd20 00007ffa`78350000 MyModule!operator new[]+0x2e 
15 0000004a`7fb7cd28 0000004a`7fb7cf88 MyModule!__imp_?id@?$codecvt@DDU_Mbstatet@@@std@@2V0locale@2@A
16 0000004a`7fb7cd30 00000000`00000000 0x0000004a`7fb7cf88

(我用MyModule替换了真实的模块名称!)

问题:

  1. 我正在猜测(通过栈跟踪中的函数名称,例如RtlpExecuteHandlerForException),如果是处理异常的话。那是对的吗?如果是,为什么应用程序仍然崩溃?

  2. 堆栈底部的__imp_?id@?$codecvt@DDU_Mbstatet@@@std@@2V0locale@2@A看上去很乱。我试图在网上取消整理并获得__imp_public: static class std::locale::id std::codecvt<char,char,struct _Mbstatet>::id。那有意义吗?它看起来像是对字段的引用,而不是函数的引用

  3. 我尝试运行!analyze -v,它给出了:

  

EXCEPTION_CODE:(NTSTATUS)0xc0000409-系统检测到溢出   此应用程序中基于堆栈的缓冲区的大小。这种超支可能   潜在地允许恶意用户对此进行控制   应用。

这种异常的原因是什么?您能否提供简短的代码段,以在Windows中触发此类异常?)

0 个答案:

没有答案