断言错误

时间:2009-04-15 05:17:00

标签: visual-c++

在vc ++ 6.0 MFC应用程序项目中,我不会得到编译错误,但是当我运行项目时,我将收到错误

Debug Assertion Failed!
program:project.exe
File:winocc.cpp
Line:345

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

它是什么错误以及为什么会发生这种类型的错误,如何调试此错误,plz帮助任何正文,

4 个答案:

答案 0 :(得分:6)

你可能会发现在第345行的winocc.cpp中有一个断言。查看一下该源文件以查看它正在检查的内容(你不应该做什么),然后停止这样做:-)

如果您没有源代码,那么您必须:

  • 联系谁编写它并找出断言是什么;或
  • 阅读API文档以了解您是否做错了什么。

断言是运行时检查,编码器使用该检查来确保遵循规则或在完成任何实际损坏之前捕获意外情况。诸如双向链表之类的东西变得腐败(例如,类似断言(x-> next-> prev!= x),如果节点A的前一节点没有节点A作为下一个节点,则会断言问题)

类似的东西:

Assert (p1 == NULL);
如果p1等于NULL,

(在我的神话语言中,如果我的C语法错误)在函数的开头将引发一个断言。

网络搜索在第345行显示以下内容(请参阅here):

  

ASSERT(m_pCtrlSite!= NULL); //不是OLE控件(至少还没有)。

并且您尝试动态创建许可的ActiveX控件这一事实看起来很麻烦。该链接还包含一个KB编号Q151804,它表示它是设计的(这意味着MS可能不会修复它) - 您需要使用有效的许可证字符串创建控件。

我发现的另一条评论指出:

  

仅创建ActiveX控件的实例是不够的。必须先正确托管ActiveX控件,然后才能使用它。你的不是。例如,您需要将其放在对话框中并创建该对话框的实例。

如果没有看到你的其余代码,很难判断这是否是你的具体问题,但是如果你的第345行是我认为的那个,这是有道理的 - 它抱怨说控制站点为NULL(即,未托管控件)。

最后要注意的是:

如果您的ActiveX控件 在对话框中,您是否尝试在之前对控件执行某些操作,则调用对话框的DoModal()

只有在您调用DoModal()后才能初始化控件,因此在发生控制之前您无法使用控件。你应该在对话框OnInitDialog()中执行此操作 - 此时,控件应该完全初始化,你可以用它做你想做的事。

如果您尝试使用对话框构造函数中的参数来操作控件,则需要将它们存储在对话框中的某个位置,并将它们传输到OnInitDialog()中的控件。< / p>

此信息主要来自here

答案 1 :(得分:1)

“assert(...)”应该通过在运行时检查某些条件来帮助您在C ++程序中找到错误。您的程序中可能没有正确配置导致此故障的内容。就像Pax说的那样,看看你是否可以打开winocc.cpp并查看第345行,看看“断言”正在检查什么,看看你能否找出它失败的原因。

通常,当您进行生产构建时,您将“编译”所有断言,这样它们就不会导致应用程序崩溃。

答案 2 :(得分:0)

断言用于在运行时检查代码中的前置条件/​​后置条件和中间结果。

最有可能的是,您在不考虑所有前提条件的情况下调用了函数/方法,并且这是在运行时检测到的。

在VC中,断言是在Debug目标上的二进制文件中引入的,而不是在Release target上。

答案 3 :(得分:0)

如果它不是您控制的DLL(有时供应商会在调试库中保留断言),您可以显示反汇编并将断言的内存位置(断开处)从3更改为90.这将改变你的__asm int 3到__noop。很适合清除中断,你可以摆脱 - 至少对于那个调试会话。 :)