调试版本构建客户端崩溃:获取调用堆栈的可能方法是什么?

时间:2011-11-22 08:56:41

标签: c++ debugging crash

我有一个原生的C ++应用程序在办公室工作正常(当然我们做测试),但客户经历了许多不同的崩溃。我知道一个可以windbg(它是一个跨平台的应用程序 - Win,Linux和Mac,但崩溃发生在所有平台上,所以调试其中一个是有用的),但操纵客户端的机器(例如安装和注册windbg)不是选项。我想知道是否有其他方法可以获得调用堆栈。是否有任何工具可以检测二进制文件以提供此类信息?

P上。 S.我猜,我可以发送.pdb文件和二进制文件,但我不想这样做。

2 个答案:

答案 0 :(得分:4)

在Windows上,您可以在客户端计算机上配置Dr.Watson,这样如果您的应用程序崩溃,它将创建所谓的“minidump文件”,然后调试器可以使用相应的PDB打开它。 / p>

您还可以向应用程序添加未处理的异常过滤器,并在出现无法恢复的错误时自行生成小型转储器。

修改

如果你想在(未处理的)异常上生成转储文件 - 不要在C ++ catch (...)块中执行此操作,因为在解除发生之后调用了,并且原始调用堆栈不可用。

为了捕获&转储调用堆栈,你应该在>堆栈展开之前将其转储。像这样:

int HandleMyException(EXCEPTION_POINTERS* pExc)
{
    // dump it
    MiniDumpWrite(...);

    // Unless you decide to terminate your process, return EXCEPTION_EXECUTE_HANDLER, so that the execution
    // continues normally after the __except block.
    return EXCEPTION_EXECUTE_HANDLER;
}

__try
{
    // Do something...
}
__except (/* stack still not unwound */ HandleMyException(GetExceptionInformation()))
{
    // unwind already took place here, nothing to dump
}

答案 1 :(得分:3)

对于Windows,您可以使用structured exception handling。 windows api允许您在程序崩溃时生成堆栈跟踪。将生成dmp文件。您可以检索该文件并在调试环境中进行调试。无需发送调试二进制文件或pdb文件。

对于跨平台,您可以使用google breakpad。该工具可生成跟踪,并可自动发送或随后由用户生成的报告发送。