【问题标题】:How do I automate mini dump creation when a c++ assertion fails?当 C++ 断言失败时,如何自动创建迷你转储?
【发布时间】:2012-06-15 16:11:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ .net debugging windbg assertions


    【解决方案1】:

    为您的应用程序创建 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 模式设置和自定义挂钩。

    注意事项:

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

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

    【讨论】:

    • 这些规则似乎都不起作用。我设置了上面的所有规则,我没有得到任何转储。我还将报告模式设置为 _CRTDBG_MODE_DEBUG 并且仍在获取对话框。也许是因为它没有使用 _ASSERT 。我正在调用 assert(0) 进行测试。我不是 100% 确定这是在哪里定义的,当涉及到 c 时,我完全是新手。当我在 VS 中点击 go to definition 时,它需要我去 assert.h。代码用vs 2008在debug模式下编译,编译成c代码。
    • 所以,显然当我在断言上点击 go to definition 时,它会将我带到 c:\Program Files (x86)\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\assert.h跨度>
    • @AlexSpence 我已经扩展了答案。也许您正在从附加了自己的调试器的 Visual Studio 中运行应用程序,尝试“不调试启动”选项并在 DebugDiag 日志中查看它是否成功附加(查看 - 日志文件夹)。希望这会有所帮助!
    • 是的,我通过 Visual Studio 控制台应用程序主机运行它,这很可能是问题所在。我终于能够获得使用 MiniDumpWriteDump 和 _CrtSetReportHook2 组合创建的转储。非常感谢!
    【解决方案2】:

    使用 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?

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多