我在一个更大的程序中观察到类似的问题,可以使用下面的代码复制:
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中运行时,我得到一个调用堆栈,该调用堆栈将转到抛出异常的位置.
有一个技巧可以到达 SEH 异常的“原始”堆栈。当内核终止程序时(这是堆栈显示的内容),它仍然保存原始堆栈的上下文记录。本文介绍如何使用 WinDBG 获取此记录:https://support.microsoft.com/en-us/help/313109/how-to-find-the-problem-exception-stack-when-you-receive-未处理的
如果您希望经常这样做,您可以为此编写一个 WinDBG 宏。
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |