Qt程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)
2017-10-06 18:35
1066 查看
在使用Qt开发大型软件时,难免要调试程序,以确保程序内的运算结果符合我们的预期。在不符合预期结果时,就直接将程序断下,以便我们修改。
这就用到了Qt中的调试断言 - Q_ASSERT。
用一个小例子来说一下 Q_ASSERT 断言的作用吧:
用QtCreator新建一个控制台程序,代码编写如下:
[cpp] view plain copy
print?
#include <QtCore>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
int a = 4,b = 3;
int c = a + b;
Q_ASSERT(c == 5);
qDebug()<<"Finish";
return app.exec();
}
注意:这里加上了
一会将看到它的作用。
然后Debug编译,并启动调试,结果程序断下了,看图:
![](http://img.blog.csdn.net/20170107104414980?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGF0czg4ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序被断下,显示 c == 5,在第10行。
这就是Q_ASSERT的神奇之处!它是一个宏,接受布尔值,当其中的布尔值为真时,便什么也不做,当其中的布尔值为假时,便断下。
我们看看Q_ASSERT的定义:
[cpp] view plain copy
print?
Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
#if !defined(Q_ASSERT)
# ifndef QT_NO_DEBUG
# define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())
# else
# define Q_ASSERT(cond) qt_noop()
# endif
#endif
在Debug版程序中,Q_ASSERT会调用qt_assert函数,而在Release版程序中,便会调用qt_noop()函数,
再看看qt_noop()是什么:
[cpp] view plain copy
print?
inline void qt_noop(void) {}
qt_noop就是一个内联空函数,在Release版中将被优化掉。
将刚才的程序代码改成:
[cpp] view plain copy
print?
Q_ASSERT(c == 7);
并再次调试运行,程序便不会被断下了,因为表达式的值为真,已经符合我们的预期。
顺便说一下,这个例子使用的是VC2013的编译器。
http://blog.csdn.net/hats8888/article/details/54171298
这就用到了Qt中的调试断言 - Q_ASSERT。
用一个小例子来说一下 Q_ASSERT 断言的作用吧:
用QtCreator新建一个控制台程序,代码编写如下:
[cpp] view plain copy
print?
#include <QtCore>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
int a = 4,b = 3;
int c = a + b;
Q_ASSERT(c == 5);
qDebug()<<"Finish";
return app.exec();
}
注意:这里加上了
Q_ASSERT(c == 5);
一会将看到它的作用。
然后Debug编译,并启动调试,结果程序断下了,看图:
程序被断下,显示 c == 5,在第10行。
这就是Q_ASSERT的神奇之处!它是一个宏,接受布尔值,当其中的布尔值为真时,便什么也不做,当其中的布尔值为假时,便断下。
我们看看Q_ASSERT的定义:
[cpp] view plain copy
print?
Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
#if !defined(Q_ASSERT)
# ifndef QT_NO_DEBUG
# define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())
# else
# define Q_ASSERT(cond) qt_noop()
# endif
#endif
在Debug版程序中,Q_ASSERT会调用qt_assert函数,而在Release版程序中,便会调用qt_noop()函数,
再看看qt_noop()是什么:
[cpp] view plain copy
print?
inline void qt_noop(void) {}
qt_noop就是一个内联空函数,在Release版中将被优化掉。
将刚才的程序代码改成:
[cpp] view plain copy
print?
Q_ASSERT(c == 7);
并再次调试运行,程序便不会被断下了,因为表达式的值为真,已经符合我们的预期。
顺便说一下,这个例子使用的是VC2013的编译器。
http://blog.csdn.net/hats8888/article/details/54171298
相关文章推荐
- Qt程序调试之Q_ASSERT断言
- C语言assert(断言)的用法-程序调试用
- iOS-----程序异常处理----- 断言NSAssert()和NSParameterAssert区别和用处
- 使用断言NSAssert()和NSParameterAssert调试程序错误
- QT tcpsocket 在断开后重新连接程序直接崩溃
- Qt中使用Google Breakpad捕获程序崩溃异常
- 使用断言NSAssert()和NSParameterAssert调试程序错误
- Xcode调试非异常导致崩溃的程序
- Python3基础 assert 断言 确保程序的正确运行条件
- Xcode调试非异常导致崩溃的程序
- Linux+QT+OpenCv摄像头调试心得(2)----点击退出关闭窗体,提示“程序异常终止”
- 使用断言NSAssert()和NSParameterAssert调试程序错误
- Xcode调试非异常导致崩溃的程序
- 使用断言NSAssert()和NSParameterAssert调试程序错误
- QT tcpsocket 在断开后重新连接程序直接崩溃
- .Net程序异常调试汇总
- VS调试时有异常,不报错,直接停止调试
- 调试opencv程序,怎么在vs运行下直接调到opencv的源码,终极,cmake后还要有pdb文件链接
- assert 调试程序
- IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS