如何在 c++ 断言失败时自动创建迷你转储
How do I automate mini dump creation when a c++ assertion fails?
我在生产服务器上使用 Sqlite,但陷入了死锁情况。 我在调试模式下编译了 System.Data.Sqlite.org dll,死锁消失了(当然他们这样做了......
现在,由于我们在调试模式下编译,每隔一段时间我就会得到断言失败。这些显然只是作为对话框出现,不会在任何地方记录?
有没有办法,可能使用 DebugDiag 或其他工具,在断言失败发生时创建内存转储?
为应用程序创建 DebugDiag 崩溃规则,使用表达式添加断点
MSVCR90D!_wassert
捕获在 Cassert 中定义的普通断言宏和
MSVCR90D!_CrtDbgReport
要捕获Microsoft调试 CRT _ASSERT,_ASSERTE宏,
MSVCR90D!_CrtDbgReportW
如果在启用 Unicode 的情况下进行编译。
您可以通过为 Ntdll!ZwTerminateProcess 添加断点、在断言失败对话框中按中止并在生成的日志中查看堆栈跟踪(c:\Program Files\DebugDiag\Logs\ 在应用程序启动时的某个位置(请参阅 MSDN 上的详细_CrtSetReportMode说明)。不幸的是,这仅适用于_ASSERT,_ASSERTE宏,_wassert函数完全跳过这些_Crt模式设置和自定义钩子。 笔记: MSVCR90D是Visual Studio 2008附带的CRT的库名称(对于VS2010,它将MSVCR100D)。 您应该直接运行应用程序(从资源管理器或从 Visual Studio 的"启动而不调试"),以便 DebugDiag 具有要附加到它的更改。_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
使用 MiniDumpWriteDump: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680360%28v=vs.85%29.aspx 并设置适当的标志,以便将所有相关信息写入转储中。
您可以通过设置注册表项来告诉 Windows 为您执行此操作,并且有 adplus 和 procdump,请参阅相关问题:崩溃生成转储和这个:生成非托管代码崩溃的转储?
- 分段故障(堆芯转储)矢量
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
- 是否可以以编程方式创建迷你转储文件而不会崩溃?
- 在访问冲突时创建转储文件
- 由procexp(MS process explorer)创建的VC10调试转储文件-只有堆栈信息,没有变量值
- 通过任务管理器创建并查看源代码创建的转储文件,如何打开
- 将进程内存转储到文件/从转储文件重新创建进程
- 有没有为mac和win应用程序创建和上传崩溃转储的服务
- 我应该使用(未记录的?)MINIDUMP_EXCEPTION_INFORMATION64结构来创建64位进程的转储吗
- OpenCV:试图创建一个空白图像,但核心已被转储
- 从矢量范围创建矢量时的堆芯转储
- 如何在 c++ 断言失败时自动创建迷你转储
- 每当应用程序崩溃时,为其创建一个转储文件
- 创建共享库时核心转储
- 为c++应用程序创建崩溃转储报告
- Windows错误报告何时创建转储文件?它是否可配置?这在Windows 7中有改变吗?
- 由类转储创建的奇异的CDStructures.h
- 如何创建和恢复内存映像转储
- 在 Linux 的分叉和杀死后停止创建核心转储文件
- 如何在核心转储中检查堆大小和创建的对象