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

标签 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;
}

这显然会因未捕获的 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/

相关文章:

c++ - 如何找到字体的宽度?

c++ - 继承带有默认参数的构造函数: Which compiler is correct?

c++ - 变量值,在三元运算符之后

c++ - Qt widget 推广 : whats difference btw these two codes?

c++ - GLOG - 没有创建输出文件日志

C++ 引用参数函数

c++ - 从 VC++ 调用 R 函数

c++ - 使用 shared_ptr 时如何检测循环

c++ - 不能使用以 lambda 作为参数的模板函数

c# - RegAsm.exe 和 regsvr32 有什么区别?如何使用 regsvr32 生成 tlb 文件?