我在生产服务器上使用Sqlite但遇到死锁情况。我在调试模式下编译了System.Data.Sqlite.org dll并且死锁消失了(当然他们做了..)
现在,因为我们是在调试模式下编译的,所以每隔一段时间我就会遇到断言失败..这些显然只是作为一个对话框出现而不会被记录到任何地方?
有没有办法,可能使用DebugDiag或其他工具,在断言失败时创建内存转储?
答案 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模式设置和自定义挂钩。
注意:
MSVCR90D是Visual Studio 2008附带的CRT的库名称(对于VS2010,它将是MSVCR100D)。
您应该直接运行应用程序(从资源管理器或“从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?