命令行参数
当你运行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)——调试技术的更多相关文章

  1. 《Visual C++ 2010入门教程》系列六:VC2010常见调试技术

    <Visual C++ 2010入门教程>系列六:VC2010常见调试技术   犹豫了好久,最终还是决定开始这一章,因为我不清楚到底有没有必要写这样的一章,是应该在这里说明一些简单的调试方 ...

  2. QT核心编程之调试技术 (g)

    Qt应用程序的调试可以通过DDD进行跟踪调试和打印各种调试或警告信息.DDD(Data Display Debugger)是使用gdb调试工具的图形工具,它安装在Linux操作系统中,使用方法可参考D ...

  3. 第十章 嵌入式Linux的调试技术

    对调试工具进行简介.Linux中提供了一类工具,通过这些工具可以逐行跟踪程序的代码,用于测试用户空间程序的gdb.gdbserver和调试内核空间程序的kgdb. 用gdb调试用户空间程序:gdb可跟 ...

  4. 【转】Linux Shell脚本调试技术

    本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...

  5. shell脚本调试技术_转

    转自:http://itlab.idcquan.com/linux/SHELL/727128.html 参考:https://linux.cn/article-8045-1.html 本文全面系统地介 ...

  6. 基于TLS的反调试技术

    TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...

  7. 掌握 Linux 调试技术

    掌握 Linux 调试技术 在 Linux 上找出并解决程序错误的主要方法 Steve Best (sbest@us.ibm.com)JFS 核心小组成员,IBM 简介: 您可以用各种方法来监控运行着 ...

  8. Shell脚本调试技术

    http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握 ...

  9. iOS 开发者旅途中的指南针 - LLDB 调试技术

    文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...

  10. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

随机推荐

  1. 为什么你需要使用instancetype而不是id

    四年前Clang添加了关键字instancetype,目的在于取代-alloc和-init等方法的返回类型id,那么使用instancetype到底比id好在哪里? instancetype宣言 不管 ...

  2. Programming a Spider in Java 源码帖

    Programming a Spider in Java 源码帖 Listing 1: Finding the bad links (CheckLinks.java) import java.awt. ...

  3. SQL查询显示行号、随机查询、取指定行数据

    转自:walkingp 1.显示行号 如果数据没有删除的情况下主键与行号是一致的,但在删除某些数据,行号就与主键不一致了,这时需要查询行号就需要用新的方法,在SQL Server2005之前,需要使用 ...

  4. PhoneGap 在eclipse上开发Android程序

    本文将记录在Eclipes上开发Android App,在使用的方法是Hybrid App(混合模式移动应用), 由于本人的工作需要,将要开发在车间使用的数据录入程序,但是其中有非常多的逻辑验证和判断 ...

  5. Unity3D 相机跟随主角移动

    这里给主相机绑定一个脚本. 脚本写为: using UnityEngine; using System.Collections; public class camerafollow : MonoBeh ...

  6. windows服务,安装、启动、停止,配置,一个批处理文件搞定

    相对而言,还是比较通用的吧,如果哪位仁兄有更好的实现方式,或者发现有不足之处,还请多多指教.  @echo off echo.------------------------------------- ...

  7. bash: ./configure: 权限不够 怎么办?

    configure没有执行权限 通过chmod给其加上x权限 chmod +x configure 再在该用户下执行 ./configure

  8. Shell case正则匹配法

    Shell case正则匹配法   case $BOOLEAN in [yY][eE][sS]) echo 'Thanks' $BOOLEAN ;; [yY]|[nN]) echo 'Thanks' ...

  9. Nhibernate主子表查询

    假如有AB两表,A为主,B为子:已知A表ID,查B表数据 ICriteria criteriaTotal = session.CreateCriteria<B>().CreateCrite ...

  10. XE6 /XE8 & IOS开发之免证书真机调试三步走,生成iPA文件并安装到其它苹果设备上

    XE6 & IOS开发之免证书真机调试(1):颁发属于自己的App签名证书(有图有真相) XE6 & IOS开发之免证书真机调试(2):连接真机并运行App(有图有真相) XE6 &a ...