有时候我的 C++ 程序在调试模式下会崩溃,我收到的是一个消息框,上面显示了一条信息,说在一些内存管理例程(访问未分配的内存等)中断言失败。但我不知道它是从哪里被调用的,因为我没有得到任何堆栈跟踪信息。如何获取堆栈跟踪信息或者至少看到它在我的代码中失败的位置(而不是库/内置例程中)?
如果我没记错的话,那个消息框应该有一个按钮,上面写着“重试”。这样做会在断言发生的地方(在调试器中)中断程序。
CrashFinder 可以帮助您定位异常的位置,只需提供 DLL 和异常报告的地址即可。
您可以将此代码集成到您的应用程序中,以在出现未捕获的异常时自动生成堆栈跟踪。通常使用 __try{} __except{}
或调用 SetUnhandledExceptionFilter 来执行此操作,后者允许您指定所有未处理异常的回调函数。
你还可以在客户端系统上安装事后调试器。这是一个不错的通用方法,可以在应用程序没有崩溃转储功能时(也许是针对旧版本,你仍需获取信息)获取信息。
在Windows上,可以通过运行命令drwtsn32 -i
安装Dr. Watson。 运行drwtsn32
(不带任何选项)将显示配置对话框。这将允许创建崩溃转储文件,稍后可以使用WinDbg或类似工具进行分析。