Qt入门(10)——调试技术
命令行参数
当你运行Qt程序时,你可以指定几个命令行参数来帮助你调试。
-nograb 应用程序不再捕获鼠标或者键盘。当程序在Linux下运行在gdb调试器中时这个选项是默认的。
-dograb 忽略任何隐含的或明显得-nograb。即使-nograb出现在命令行的最后,-dograb也会超过-nograb生效的。
-sync 在X同步模式下运行应用程序。同步模式强迫X服务器立即执行每一个X客户端的请求,而并不能使用缓存优化。它使得程序更加容易测试并且通常会更慢。-sync模式只对X11版本的Qt有效。
警告和调试消息
Qt包含了三个全局函数来写出警告和调试文本。
qDebug()用来为测试及其它写调试输出。
qWarning()用来在程序发生错误时写警告输出。
qFatal()用来写致命错误消息并且退出。
这些函数的Qt实现是在Unix/X11下把文本打印到标准错误(stderr)输出,在Windows下会打印到调试器。你可以通过安装一个消息处理器,qInstallMsgHandler()来接收这些函数。
当应用程序看起来或者用起来很奇怪的时候,调试函数QObject::dumpObjectTree()和QObject::dumpObjectInfo()很有用。如果你使用了对象名称,这将会更有用,但通常情况下是没有名称的。
调试宏
qglobal.h头文件包含了很多调试宏和#defines。
两个重要的宏是:
Q_ASSERT(b)里面的b是一个布尔表达式,当b是FALSE的时候,写出警告信息:“ASSERT: 'b' in file file.cpp (234)”。
Q_CHECK_PTR(p)里面的p是一个指针。如果p是空的话,写出警告信息:“In file file.cpp, line 234: Out of memory”。
这些宏在检测程序错误时很有用,比如像这样:
char *alloc( int size )
{
Q_ASSERT( size > 0 );
char *p = new char[size];
Q_CHECK_PTR( p );
return p;
}
如果你定义了QT_FATAL_ASSERT标记,Q_ASSERT将会调用fatal()而不是warning(),所以一个错误声明将会导致在打印错误消息后使程序退出。
注意如果QT_CHECK_STATE未定义,Q_ASSERT宏就是一个空的表达式(参见下面)。在里面的任何代码都不会被执行。相似的,如果QT_CHECK_NULL未定义,Q_CHECK_PTR也是一个空的表达式。这里就是一个不应该如此使用Q_ASSERT和Q_CHECK_PTR的例子:
char *alloc( int size )
{
char *p;
Q_CHECK_PTR( p = new char[size] ); // WRONG
return p;
}
这个问题是棘手的:仅仅在正确的检测标记被定义时,p才会被设置为健全的值。如果QT_CHECK_NULL标记没有被定义,代码被编译了,在Q_CHECK_PTR表达式中的代码是不会被执行的(正确地,因为它仅仅用于调试目的)并且会分配一个疯狂的指针。
Qt库包含了几百个内部检查,当一些错误被检测出时,会打印警告信息。
Qt中的健全测试和作为结果的警告信息是有条件的,基于不同的调试标记的状态:
QT_CHECK_STATE:检测一致的/期望的对象状态
QT_CHECK_RANGE:检测变量范围错误
QT_CHECK_NULL:检测危险的空指针
QT_CHECK_MATH:检测危险的数学,比如被0除
QT_NO_CHECK:关闭所有的QT_CHECK_...标记
QT_DEBUG:使调试代码生效
QT_NO_DEBUG:关闭QT_DEBUG标记
默认情况下,QT_DEBUG和所有的QT_CHECK标记都是打开的。如果要关闭QT_DEBUG,请定义QT_NO_DEBUG。如果要关闭QT_CHECK标记,请定义QT_NO_CHECK。
实例:
void f( char *p, int i )
{
#if defined(QT_CHECK_NULL)
if ( p == 0 )
qWarning( "f: Null pointer not allowed" );
#endif #if defined(QT_CHECK_RANGE)
if ( i < 0 )
qWarning( "f: The index cannot be negative" );
#endif
}
普通的Bug
这是一个如此普通的bug,所以要在这里提到:如果你你在类生命中包含了Q_OBJECT宏并且运行了moc,但是忘记了把moc生成的对象代码连接到你的可执行程序中,你就会得到非常困惑的错误消息。
任何一个会提示缺乏vtbl、_vtbl、__vtbl或者和这个类似的连接错误都有可能是这样的问题。
Qt入门(10)——调试技术的更多相关文章
- 《Visual C++ 2010入门教程》系列六:VC2010常见调试技术
<Visual C++ 2010入门教程>系列六:VC2010常见调试技术 犹豫了好久,最终还是决定开始这一章,因为我不清楚到底有没有必要写这样的一章,是应该在这里说明一些简单的调试方 ...
- QT核心编程之调试技术 (g)
Qt应用程序的调试可以通过DDD进行跟踪调试和打印各种调试或警告信息.DDD(Data Display Debugger)是使用gdb调试工具的图形工具,它安装在Linux操作系统中,使用方法可参考D ...
- 第十章 嵌入式Linux的调试技术
对调试工具进行简介.Linux中提供了一类工具,通过这些工具可以逐行跟踪程序的代码,用于测试用户空间程序的gdb.gdbserver和调试内核空间程序的kgdb. 用gdb调试用户空间程序:gdb可跟 ...
- 【转】Linux Shell脚本调试技术
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...
- shell脚本调试技术_转
转自:http://itlab.idcquan.com/linux/SHELL/727128.html 参考:https://linux.cn/article-8045-1.html 本文全面系统地介 ...
- 基于TLS的反调试技术
TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...
- 掌握 Linux 调试技术
掌握 Linux 调试技术 在 Linux 上找出并解决程序错误的主要方法 Steve Best (sbest@us.ibm.com)JFS 核心小组成员,IBM 简介: 您可以用各种方法来监控运行着 ...
- Shell脚本调试技术
http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握 ...
- iOS 开发者旅途中的指南针 - LLDB 调试技术
文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
随机推荐
- Objective-C:KVC
1 概述 1.1 访问方法 Key-value coding(KVC)是一种间接访问对象属性的机制,类似键值对,通过名字(或键)可以直接获得对象的属性值.事实上,key-value coding定义了 ...
- +load,+initialize原理
+load,+initialize原理 1.load 父类的load方法在子类load方法之前调用,分类的load方法在原来类load方法之后调用,依赖类的load方法会在自己之前调用,总之所有的类的 ...
- JQuery的$命名冲突详细解析
在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg')的写法.然而,当我们引入多个js库后,在另外一个js库中 ...
- Android开发手记(25) 简单Service的实现
本文将通过实现一个简单的Service发送简单消息,然后通过一个BroadcastReceiver接收Service发送的消息,从而改变一个TextView的文本颜色. 这里,我们需要三个java文件 ...
- HTTP could not register URL http://+:8000/.... Your process does not have access rights to this namespace
windows 7, Visual Studio 2013 在托管 Windows 服务中承载 WCF 服务时报错: HTTP could not register URL http://+:8000 ...
- NgNice项目案例
技术构架: 服务端技术:NodeJS + Express4.x + Mongodb + Mongoose 前端技术: AngularJS1.2.x + Bootstrap3.x 源码:https:// ...
- iOS9 application:application openURL: sourceApplication: annotation: 方法不执行
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9 ...
- Win异常: 除了chrome浏览器外,所有安装的软件都连不上网
经查找资料,是LSP被篡改,恢复后使用正常. 百度百科 LSP: Layered Service Provider, 即分层服务提程序,Winsock 作为应用程序的 Windows 的网络套接字工 ...
- linux 监控系统缓存和cpu
a=`free |head -n 2 |tail -n 1 |awk '{print $7}'`if [ $a -ge 900000 ];then sync && echo 1 ...
- C#快速导入海量XML数据至SQL Server数据库
#region 将Xml中的数据读到Dataset中,然后用SqlBulkCopy类把数据copy到目的表中using (XmlTextReader xmlReader = new XmlTextRe ...