我在生产服务器上使用 Sqlite 但进入死锁场景。我在调试模式下编译了 System.Data.Sqlite.org dll,死锁消失了(当然他们做到了..)
现在,由于我们是在调试模式下编译的,所以每隔一段时间我就会遇到断言失败。这些显然只是作为一个对话框出现并且不会在任何地方记录下来?
有没有办法(可能使用 DebugDiag 或其他工具)在发生断言失败时创建内存转储?
我在生产服务器上使用 Sqlite 但进入死锁场景。我在调试模式下编译了 System.Data.Sqlite.org dll,死锁消失了(当然他们做到了..)
现在,由于我们是在调试模式下编译的,所以每隔一段时间我就会遇到断言失败。这些显然只是作为一个对话框出现并且不会在任何地方记录下来?
有没有办法(可能使用 DebugDiag 或其他工具)在发生断言失败时创建内存转储?
为您的应用程序创建 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 上的详细 _CrtSetReportMode 描述)。不幸的是,这仅适用于 _ASSERT、_ASSERTE 宏,_wassert 函数完全跳过了这些 _Crt 模式设置和自定义挂钩。
笔记:
MSVCR90D 是 Visual Studio 2008 附带的 CRT 的库名称(对于 VS2010,它将是 MSVCR100D)。
您应该直接运行应用程序(从资源管理器或 Visual Studio 中的“不调试启动”),以便 DebugDiag 将更改附加到它。
使用 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?