mfc140ud.dll 中的调试断言失败

Posted

技术标签:

【中文标题】mfc140ud.dll 中的调试断言失败【英文标题】:Debug Assertion Failed in mfc140ud.dll 【发布时间】:2016-05-02 15:52:36 【问题描述】:

当我创建一个新对话并在其上调用 DoModel 时。我收到以下调试断言。

代码是

if (m_pWatchDogDialog->WatchDogServer().CurrentUserStatus() == CServerLink::AWAY)
                
                    CString msg("Requested user is away");
                    m_pWatchDogDialog->WatchDogServer().SendUserMessage(m_UserKey, msg);
                
            else
            
                AcceptFile *dlg = new AcceptFile();
                dlg->DoModal(); // error is throwing up here
            

报错如下图

The Assertion is at the debug point as shown in image in dlgcore.cpp file

【问题讨论】:

当你点击Retry时,会发生什么?你应该已经被带到了运行时库中调用断言的那一行。 @PaulMcKenzie:afxwin1.inl 是 MFC 实现的一部分,而不是运行时。除此之外,是的,显然单击重试,正如断言对话框所暗示的那样……不要再无助了。此外,您应该为 AcceptFile 对象使用自动存储持续时间。没有理由new 它,除非你想训练你的内存泄漏调试技能。此外,不要忽略应用程序终止时的调试输出。它告诉你,你正在泄漏内存。 按照建议,我将我的代码更改为 AcceptFile 对象的自动存储,但我再次遇到同样的错误 @AjithKumar。 1:点击Retry,它将在mfc库上出现问题的位置进入调试器。检查该代码可能会提示您正在发生什么。在图像的断点处,dlgcode.cpp 中没有断言。 2:向我们展示更多您的代码。 @AjithKumar 这是一个什么样的项目?这个对话框在 DLL 中吗? 【参考方案1】:

假设 AcceptFile 继承自 CDialog,您可能可以通过扩展 AcceptFile 构造函数并使用 lpszTemplateName 参数调用 CDialog 构造函数来阻止调试断言。例如:

class AcceptFile : public CDialog

public:
    AcceptFile(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL)
        : CDialog(lpszTemplateName, pParentWnd)
    
        // your code here
    

// other stuff
;

【讨论】:

以上是关于mfc140ud.dll 中的调试断言失败的主要内容,如果未能解决你的问题,请参考以下文章

对使用共享 MFC 核心 DLL 的 MFC 项目使用 CTrace::SetLevel

使用 mfc 的 EXE(调试)无法在其他 PC 上运行

在 MFC 编程的 \$InstallDir\VC\atlmfc\src\mfc\olelock.cpp 第 62 行上调试断言失败

在类构造函数中使用 MFC 按钮控件 EnableWindow 方法时“调试断言失败”

加载 MFC 视图时在 \$InstallDir\VC\atlmfc\src\mfc\appgui3.cpp 上调试断言失败,第 385 行

没有找到MFC42D.DLL