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

标签 c++ .net debugging windbg assertions

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

注释:

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

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

关于c++ - 当 C++ 断言失败时,如何自动创建小型转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054488/

相关文章:

c++ - 跨平台 C++ 解析器库

JavaScript 获取数组大小效率

c# - 笔记本电脑/台式机 sleep 事件

c# - 如何查看每秒更新的图表中的最后 10 个数据点?

python - 如何在没有 dunder setattr 或 pdb 的情况下观察 python 中的变量变化

c++ - 如何通过 boost 获得 0.5 增量的随机数?

c++ - 确定类静态变量的总大小?

c# - 隐式运算符?

android - 2.3 之前的 StrictMode

debugging - 突然我无法在VS2010中调试任何东西