如何在 c++ 断言失败时自动创建迷你转储

How do I automate mini dump creation when a c++ assertion fails?

本文关键字:创建 转储 c++ 断言 失败      更新时间:2023-10-16

我在生产服务器上使用 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\

_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);

在应用程序启动时的某个位置(请参阅 MSDN 上的详细_CrtSetReportMode说明)。不幸的是,这仅适用于_ASSERT,_ASSERTE宏,_wassert函数完全跳过这些_Crt模式设置和自定义钩子。

笔记:

  1. MSVCR90D是Visual Studio 2008附带的CRT的库名称(对于VS2010,它将MSVCR100D)。

  2. 您应该直接运行应用程序(从资源管理器或从 Visual Studio 的"启动而不调试"),以便 DebugDiag 具有要附加到它的更改。

使用 MiniDumpWriteDump: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680360%28v=vs.85%29.aspx 并设置适当的标志,以便将所有相关信息写入转储中。

您可以通过设置注册表项来告诉 Windows 为您执行此操作,并且有 adplus 和 procdump,请参阅相关问题:崩溃生成转储和这个:生成非托管代码崩溃的转储?