【问题标题】:VS2017: Debug Assertion Failed shows in Output but don't get the MessageBox with Abort, Retry Ignore?VS2017:Debug Assertion Failed 显示在输出中,但没有得到带有 Abort、Retry Ignore 的 MessageBox?
【发布时间】:2021-05-04 01:11:42
【问题描述】:

有一个使用 MFC DLL 的 VS2017 MFC x64 .EXE 并在关闭应用程序时获得一个断言。通常会显示一个消息框,其中包含 Abort、Retry、Ignore 选项。在这种情况下什么都没有,只是:

Debug Assertion Failed!

Program: C:\WINDOWS\SYSTEM32\mfc140ud.dll
File: d:\agent\_work\2\s\src\vctools\vc7libs\ship\atlmfc\include\afxcmn.inl
Line: 291

在输出窗口中,程序结束。

当我添加以下内容时它开始这样做(它可能不喜欢 NULL):

CWorkSpaceBar::~CWorkSpaceBar()
{
  // clean up checkbox state imagelist
  CImageList *pimglist=m_wndTree.SetImageList(NULL, TVSIL_STATE);
  if (pimglist) {
    pimglist->DeleteImageList();
  }
}

但我希望该框出现,以便我可以单击“重试”以中断单步执行。如果我在该行上设置一个断点,它会中断,但 F11 不会跟随它。我发现它只有在我静态链接 MFC 库时才有效。

我在哪里可以找到消息框不显示的原因,以及在非静态链接时是否可以单步执行 MFC 代码?

谢谢。

【问题讨论】:

  • MFC 在关闭时将不会显示(模态)对话框。但是您仍然拥有诊断问题所需的所有信息。调试输出显示错误断言的位置,您可以在此处设置断点。您不需要从那里单步执行;检查调用堆栈就足够了。
  • 哪个 SDK 版本?在旧的ucrtbased 中有这样的bug,从那以后很久就修复了。
  • 同样重要的是:您何时调用清理代码?断言表明,您 m_wndTree 不再引用有效的 HWND。您可能只是调用清理代码太晚了,但如果没有信息,我们无能为力。
  • 您之前是否使用非空指针调用了SetImageList?那个指针是怎么得到的?
  • C++' 对象生命周期通常不映射到窗口生命周期。从 C++ d'tor 运行窗口代码经常会导致 IsWindow 断言失败(如在这个问题中)。一个窗口的道德等价物是它的WM_NCDESTROY 处理程序。这是解决核心问题。如果您想尝试调试断言对话框,您可以在整个代码中添加 ASSERT(FALSE) 调用。

标签: visual-studio visual-c++ visual-studio-2017 mfc visual-studio-debugging


【解决方案1】:

调试断言的行为是通过_CrtSetReportMode 函数控制的。默认情况下,失败的调试断言会被定向到一个对话框 (_CRTDBG_MODE_WNDW)。

您的应用程序(直接或间接)似乎将设置更改为_CRTDBG_MODE_DEBUG。这在 CI 设置中很有用,可以在不需要用户交互的情况下收集尽可能多的诊断输入。

如果您想显示调试对话框,请务必使用

_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_WNDW );

不要改变它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2013-09-04
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多