我有一个本机C++应用程序,它在办公室工作得很好(当然,我们做测试),但客户端经历了许多不同的崩溃。我知道可以使用windbg (它是一个跨平台的应用程序,可以在Linux和Mac上运行,但是所有平台都会崩溃,所以调试其中任何一个都是有用的),但是操作客户端的机器(例如安装和注册windbg )是不可行的。我想知道是否有其他方法可以获得调用堆栈。有没有什么工具可以检测二进制文件来提供这样的信息?
附言:我想我可以将.pdb文件与二进制文件一起发布,但我不希望这样做。
发布于 2011-11-22 17:06:50
在Windows上,你可以在客户机上配置Dr.Watson,这样如果你的应用程序崩溃,它会创建所谓的“小型转储文件”,然后调试器可以用适当的PDB打开这个文件。
您还可以将未处理的异常过滤器添加到您的应用程序中,并在出现不可恢复的错误时自己生成小型转储。
编辑:
如果您想在出现(未处理的)异常时生成转储文件,请不要在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
}发布于 2011-11-22 17:10:02
对于Windows,您可以使用structured exception handling。windows api允许您在程序崩溃时生成堆栈跟踪。将生成一个dmp文件。您可以检索该文件并在调试环境中进行调试。不需要发布调试二进制文件或pdb文件。
对于跨平台,你可以使用google breakpad。该工具生成跟踪,并可以自动发送或随后发送用户生成的报告。
https://stackoverflow.com/questions/8224178
复制相似问题