Windows错误报告和超出范围的异常

dor*_*ron 9 c++ visual-c++

我在一个更大的程序中观察到类似的问题,可以使用下面的代码复制:

int main()
{
    printf("starting application");
    std::string str {"This is my string"};
    printf("The last char is %d", (int)(str.at(str.size()))); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这显然是一个未被捕获的崩溃std::range_error.

为了调试这个,我设置了Windows错误报告,正如预期的那样,它正在创建一个minidump.但是,当我将minidump加载到Visual Studio中以生成调用堆栈时,我得到以下内容:

msvcr120.dll!abort() Line 88    C
msvcr120.dll!terminate() Line 96    C++
test2.exe!__CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS * pPtrs) Line 39 C++
KERNELBASE.dll!_UnhandledExceptionFilter@4()    Unknown
ntdll.dll!__RtlUserThreadStart()    Unknown
ntdll.dll!__RtlUserThreadStart@8()  Unknown
Run Code Online (Sandbox Code Playgroud)

这对于确定问题的根本原因是完全没用的.

我所追求的是一个像以下的callstack:

KernelBase.dll!_RaiseException@16() Unknown
[External Code] 
msvcp120.dll!std::_Xout_of_range(const char * _Message) Line 24 C++
test2.exe!main() Line 16    C++
[External Code] 
Run Code Online (Sandbox Code Playgroud)

(当使用调试器运行时)它标识std :: range_error发生的位置.有谁知道如何配置Windows错误报告,因此它不会像在顶部调用堆栈中那样隐藏错误?

我在使用g ++的Linux上使用Visual Studio 2013.应用程序核心转储,当核心在gdb中运行时,我得到一个调用堆栈,该调用堆栈将转到抛出异常的位置.

Ste*_*eed 1

有一个技巧可以到达 SEH 异常的“原始”堆栈。当内核终止程序时(这是堆栈显示的内容),它仍然保存原始堆栈的上下文记录。本文介绍如何使用 WinDBG 获取此记录:https://support.microsoft.com/en-us/help/313109/how-to-find-the-problem-exception-stack-when-you-receive-未处理的

如果您希望经常这样做,您可以为此编写一个 WinDBG 宏。