【发布时间】: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