我在一个更大的程序中观察到一个类似的问题,可以用下面的代码复制:
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;
}
这显然会因未捕获的 std::range_error
而崩溃。
为了对此进行调试,我设置了 Windows 错误报告,并且正如预期的那样创建了一个小型转储。但是,当我将小型转储加载到 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
这对于确定问题的根本原因完全没有用。
我想要的是这样的调用栈:
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]
(使用调试器运行时) 它标识了 std::range_error 发生的位置。有谁知道如何配置 Windows 错误报告,以便它不会像在顶部调用堆栈中那样隐藏错误?
我正在使用 g++ 在 Linux 上使用 Visual Studio 2013。应用程序核心转储,当核心在 gdb 中运行时,我得到一个调用堆栈,该调用堆栈转到抛出异常的位置。
最佳答案
有一个技巧可以到达 SEH 异常的“原始”堆栈。当内核终止程序时(这是您的堆栈显示的内容),它仍然保存原始堆栈的上下文记录。本文介绍如何使用 WinDBG 获取此记录:https://support.microsoft.com/en-us/help/313109/how-to-find-the-problem-exception-stack-when-you-receive-an-unhandlede
如果您希望经常这样做,您可以为此编写一个 WinDBG 宏。
关于c++ - Windows 错误报告和超出范围的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47017643/