vc++ 调试时出现Debug Assertion Failed!该怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc++ 调试时出现Debug Assertion Failed!该怎么办?相关的知识,希望对你有一定的参考价值。

Program:D\vc test\833\Debug\833.exe
File:afxwin2.inl
Line:51

1、首先需要打开vc++,然后开始编写好程序源代码。

2、在执行程序时弹出的错误警告对话框,这个就是错误的信息,然后按快捷键y,等待一会。

3、最后,此时使用delete就是删除一个不存在的指针,从而报错,如下效果就是可以了。

参考技术A

1、先写出源代码。

2、下图是在执行程序时弹出的错误警告对话框,类似的情况很多,我在调试dll插件的时候也时常碰到,后来发现大多是指针引起的错误。

3、因为pDist指针是静态分配的内存,当程序运行完后,其内存自动释放,此时使用delete就是删除一个不存在的指针,从而报错,而实际上delete是与new搭配使用的。

4、如果在运行的过程中你想知道每个变量有没有赋值,都是什么值的话可以从下图中查看

5、在下图标红的位置处你可以看到自己究竟在哪些地方加了断点。不需要时可以勾选掉,那样程序就不会走进去了。

6、如果你在运行的过程中知道是哪个地方出错了不需要走下去了,就点击一下下面的按钮程序将自动退出debug模式。

参考技术B 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 参考技术C 窗口可能还没有创建.具体要看你的代码. 参考技术D 对应50、51行为:
_AFXWIN_INLINE void CWnd::SetFont(CFont* pFont, BOOL bRedraw)
ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, WM_SETFONT, (WPARAM)pFont->GetSafeHandle(), bRedraw);

ASSERT(::IsWindow(m_hWnd)); //表示 ::IsWindow(m_hWnd) 这个函数一定要返回true,否则就会弹出你这个对话框。这说明你这个CWnd类并不是一个有效的窗口。

ASSERT 对于检测代码的错误很重要,你应该学习并掌握,且在你自己的代码多用它。像这个例子,由于有ASSERT,你能够很快把程序的错误定位到“是由于你的CWnd类有问题” 。

一般ASSERT错误对话框出现后,按重试按钮 ,vs 会定位到错误的源代码 。这时需要观察“调用堆栈”(在调试模式下 按ALT+7 可以打开调用堆栈窗口),看看程序整个调用过程,是哪一步出错了导致现在的结果。

记住: ASSERT 和 调用堆栈 这2个工具 对于调试程序很重要。你的程序难免错误,这会帮你很快找到错误。希望你记住,去网上找找相关的知识。本回答被提问者和网友采纳

opencv检错:程序运行过程正常,当跳出函数时出现断言错误(Debug Assertion Failed)

转载http://blog.csdn.net/u012327581/article/details/51351780

1.问题描述

在VS2015下配置好Opencv后,程序在函数运行过程中正常,调试时发现,当运行至跳出函数时,出现断言错误。

2.原因分析 

单步跟踪调试发现,在函数结束时会进行vector的析构,出现了析构错误。并且,如果vector在定义完成之后,进行resize或reserve操作,将vector空间做大,问题消失。后来查阅资料,结合亲身测试,发现是在调用Opencv 库时,由于opencv库编译使用的是 VC12(或者VC10/VC11)编译的,而本人使用的VS2015使用的时VC14(14是内部编码),不同版本的编译器造成析构方法冲突。

3.解决方法

使用VC12版本的库,需要使用VC12的编译器即可,如VS2012、VS2013 
使用VC14编译器时,截至目前,Opencv官网的2.4.*系列版本的库只有VC10/VC11/VC12编译的版本,只有OpenCV3.0之后的版本含有VC14编译的版本。因而本人又重新将opencv使用VS2015进行编译,设置好参数后,问题解决。

 


 卸载vs2015,装上VS2012之后,运行某些vector不会报错了,但是并非所有的vector都能正常运行(这个真的很坑人),重新出现的断言错误如下

此处省略,详情查看下面的链接……

详细链接  http://blog.csdn.net/jianjian1992/article/details/49247003

上面的3楼,针对部分vector有用(占空间不那么大的程序),如果是针对视频的处理,最终还是会失败(治标不治本)。

使用1楼的方法,将依赖库进行修改(改成没有d的情况,末尾有d是debug模式,没有d才是release模式)

改成release模式后虽然能用,但始终没有明白原因,o(╯□╰)o

 

以上是关于vc++ 调试时出现Debug Assertion Failed!该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

用VC编程时运行提示出错Microsoft Visual C++ Runtime Library Assertion failed!。 求高手解决啊!

VC++程序调试时出现“ 下面的框架可能不正确和/或缺失,没有为 kernel32.dll 加载符号”怎么回事?

Eclipse debug断点调试代码时出现source not found问题

打开文件时出现assertion failure 怎么办

VS调试出现:Debug Assertion Failed! Expression:_pFirstBlock==pHead; Expression:_acrt_first_block==header

使用 firestore 时出现以下错误错误:FIRESTORE (8.1.2) INTERNAL ASSERTION FAILED: Unexpected state