获取有关在catch块中抛出c ++异常的位置的信息?

tfi*_*iga 8 c++ logging exception visual-c++

我有一个c ++应用程序,它在try块中包含大部分代码.当我捕获异常时,我可以将用户返回到稳定状态,这很好.但我不再接收崩溃转储了.我真的想弄清楚代码中的异常发生在哪里,所以我可以记录并修复它.

能够在不停止应用程序的情况下获得转储将是理想的,但我不确定这是否可行.

有什么方法可以找出catch块中抛出异常的位置?如果它有用,我在windows xp及更高版本上使用本机msvc ++.我的计划是简单地将崩溃记录到各个用户的计算机上的文件中,然后在达到一定大小后上载崩溃日志.

val*_*ldo 6

使用SEH(结构化异常处理)可以实现这一点.关键是MSVC通过SEH实现C++异常.另一方面,纯SEH更强大,更灵活.

这就是你应该做的.而不是像这样使用纯C++ try/catch块:

try
{
    DoSomething();
} catch(MyExc& exc)
{
    // process the exception
}
Run Code Online (Sandbox Code Playgroud)

您应该DoSomething使用SEH块包装内部代码块:

void DoSomething()
{
    __try {
        DoSomethingInner();
    }
    __except (DumpExc(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) {
        // never get there
    }
}

void DumpEx(EXCEPTION_POINTERS* pExc)
{
    // Call MiniDumpWriteDump to produce the needed dump file
}
Run Code Online (Sandbox Code Playgroud)

也就是说,在C++ try/catch块中,我们放置了另一个原始SEH块,它只转储所有异常而不捕获它们.

有关使用MiniDumpWriteDump的示例,请参见此处.

  • 这是处理C++异常的有效方法.如果您想获得有关OS异常的有用信息,例如堆栈溢出或访问冲突,您应该安排从另一个进程调用`MiniDumpWriteDump`. (2认同)