当c ++断言失败时,如何自动创建小型转储?

时间:2012-06-15 16:11:41

标签: c++ .net debugging windbg assertions

我在生产服务器上使用Sqlite但遇到死锁情况。我在调试模式下编译了System.Data.Sqlite.org dll并且死锁消失了(当然他们做了..)

现在,因为我们是在调试模式下编译的,所以每隔一段时间我就会遇到断言失败..这些显然只是作为一个对话框出现而不会被记录到任何地方?

有没有办法,可能使用DebugDiag或其他工具,在断言失败时创建内存转储?

2 个答案:

答案 0 :(得分:2)

为您的应用程序创建DebugDiag崩溃规则,使用表达式

添加断点
MSVCR90D!_wassert

捕获在cassert和

中定义的普通断言宏
MSVCR90D!_CrtDbgReport

捕获Microsoft调试CRT _ASSERT,_ASSERTE宏,

MSVCR90D!_CrtDbgReportW

如果您正在使用unicode进行编译。

你可以通过为Ntdll添加断点来找到所需的表达式!ZwTerminateProcess,在断言失败对话框中按abort并在生成的日志中查看堆栈跟踪(c:\ Program Files \ DebugDiag \ Logs \< process name>)

要摆脱“中止,重试或忽略”对话框调用

_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);

应用程序启动时的某个地方(请参阅MSDN上的the detailed _CrtSetReportMode description)。不幸的是,这仅适用于_ASSERT,_ASSERTE宏,_wassert函数完全跳过这些_Crt模式设置和自定义挂钩。

注意:

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

  2. 您应该直接运行应用程序(从资源管理器或“从Visual Studio中启动而不启动”),以便DebugDiag进行更改以附加到它。

答案 1 :(得分:1)

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

您可以通过设置注册表项告诉Windows为您执行此操作,并且有adplus和procdump,请参阅相关问题:crash generate dump并且:Generate dump with unmanaged code crash?