我在生产服务器上使用 Sqlite,但遇到了死锁情况。我在 Debug模式下编译了 System.Data.Sqlite.org dll,死锁消失了(当然他们做到了......)
现在,由于我们是在 Debug模式下编译的,所以每隔一段时间我就会遇到断言失败。这些显然只是作为一个对话框出现并且不会在任何地方记录?
有没有办法(可能使用 DebugDiag 或其他工具)在发生断言失败时创建内存转储?
最佳答案
为您的应用程序创建 DebugDiag 崩溃规则,使用表达式添加断点
MSVCR90D!_wassert
捕获cassert中定义的普通断言宏
MSVCR90D!_CrtDbgReport
捕获 Microsoft 调试 CRT _ASSERT、_ASSERTE 宏,
MSVCR90D!_CrtDbgReportW
如果您在启用 unicode 的情况下进行编译。
您可以通过为 Ntdll!ZwTerminateProcess 添加断点、在断言失败对话框中按 abort 并查看生成的日志 (c:\Program Files\DebugDiag\Logs\
摆脱“中止、重试或忽略”对话框调用
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
应用程序启动时的某个位置(请参阅 MSDN 上的 the detailed _CrtSetReportMode description)。不幸的是,这仅适用于 _ASSERT、_ASSERTE 宏,_wassert 函数完全跳过这些 _Crt 模式设置和自定义 Hook 。
注释:
MSVCR90D 是 Visual Studio 2008 附带的 CRT 库名称(对于 VS2010,它将是 MSVCR100D)。
您应该直接运行应用程序(从资源管理器或从 Visual Studio 中“启动而不调试”),以便 DebugDiag 将更改附加到它。
关于c++ - 当 C++ 断言失败时,如何自动创建小型转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054488/