命令行参数
当你运行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] ); // WRONGreturn 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或者和这个类似的连接错误都有可能是这样的问题。

转载于:https://www.cnblogs.com/niulanshan/p/6174679.html

Qt入门(10)——调试技术相关推荐

  1. PHP 入门 - 10.应用技术

    文章目录 输出缓存 输出缓冲区 函数 错误处理 错误报告 错误抑制 触发错误 定义错误处理器 错误处理器中的日志 性能调优 分析 优化执行时间 优化内存占用 扩展流量的三种方式: 反向代理缓存 负载均 ...

  2. C语言及程序设计提高例程-10 调试技术:进入函数内部去

    贺老师教学链接  C语言及程序设计提高 本课讲解 老革命遇上新问题(哪错了?) #include <stdio.h> float max(float x, float y); int ma ...

  3. web前端入门必知的10个技术

    随着HTML5的发展和普及,了解HTML5将成为Web开发人员的必修课.如何把网页做得更美观,对用户更有吸引力,不仅是企业对前端开发人员要求,更是一个合格的web前端工程师的自我修行.今天小编就跟大家 ...

  4. 【精华】掌握Qt调试技术

    前言 软件调试,是开发过程中必备的技能.通过调试可以发现软件存在的bug,即缺陷.调试可以帮助开发者窥探到软件运行过程中的详细状态,从而为消除bug提供重要信息.调试的英文是debug,前面的de在英 ...

  5. 我的coding之路--实习第一个月的感悟 和 QT 入门方法

    感悟与经验 实习第一个感悟 QT快速入门方法 前期基础篇 发展篇 实际开发篇 字符串切割 Tab页的隐藏 结语 实习第一个感悟 我从投简历开始到入职一共花了大概两周不到的时间,没有什么诀窍,就是海投, ...

  6. SLAM导航机器人零基础实战系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览...

    SLAM导航机器人零基础实战系列:(二)ROS入门--10.在实际机器人上运行ROS高级功能预览 摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了 ...

  7. shell脚本调试技术

    Shell脚本调试技术 曹 羽中 (caoyuz@cn.ibm.com), 软件工程师, IBM中国开发中心 曹羽中,在北京航空航天大学获得计算机软件与理论专业的硕士学位,具有数年的 unix 环境下 ...

  8. PHP程序员的优化调试技术和技巧

    使用调试器,可以设置断点并查看 PHP 代码到所设断点之前的浏览器输出.然后可以继续代码的执行并查看到下一断点之前的浏览器输出,然后再到下一个,直到 PHP 脚本完成. 现在把 "设置&qu ...

  9. Linux调试技术介绍

    对于任何编写内核代码的人来说,最吸引他们注意的问题之一就是如何完成调试.由于内核是一个不与某个进程相关的功能集,其代码不能很轻松地放在调试器中执行,而且也不能跟踪. 本章介绍你可以用来监视内核代码和跟 ...

  10. linux内核调试技术 kprobe使用与实现

    Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术.利用kprobes技术,内核开发人员可以在内核的绝大多数指定函数中动态的插入探测点来收集 ...

最新文章

  1. OpenAI开放GPT-3微调功能,一行命令就能实现!正确率最高提升4倍
  2. (Mirage系列之十)Mirage经典案例之系统恢复
  3. java se 1335,1335.逼退法王
  4. 启发式搜索 A*算法的OC 实现
  5. Flutter进阶—质感设计之直接输入
  6. 万年历c语言编程怎么做,用C语言如何编写“万年历”
  7. python中文视频教程-中谷教育python中文视频教程(全38集)
  8. 嵌入式ctags跳转和全局打印日志
  9. SQL:postgresql中合并多个geom数据ST_Union以及比较两个geom数据是否相同ST_Equals
  10. 9.4SAS软件入门
  11. Java实现网页滑动验证与短信验证码案例精析
  12. Hello CTP(二)——CTP简介
  13. kit框架详解(基于go-kit)
  14. System.Drawing.Printing.InvalidPrinterException: 未安装打印机。
  15. 最新微信8.0.1抢红包神器-亲测2021年2月11日可用-安卓IOS
  16. linux sftp与ftp,Linux ftp和sftp命令
  17. 数组下标越界可能出现的问题
  18. mysql存储过程 2000工资加200_花200万留学才拿2000工资?瞎扯!海归平均工资真相是这样的~...
  19. 全球与中国1,6-己二醇市场深度研究分析报告
  20. 基于JAVA绿洲小区快递配送系统计算机毕业设计源码+数据库+lw文档+系统+部署

热门文章

  1. java虚拟机及加载class文件的原理机制
  2. 《碟中谍4:幽灵协议》蓝光1080P 720P首发!!汤姆克鲁斯主演
  3. 医院管理制度【第一辑】2010年11月12日
  4. [征求意见]团队发展、技术交流主题、团队机构
  5. bootstrap官网
  6. c# typeof 与 Type.GetType 使用与效率对比
  7. 快速体验 Sentinel 集群限流功能,只需简单几步
  8. 科学家研发机器人混入南极企鹅群 获“友好”对待
  9. Python Json序列化与反序列化
  10. 设计模式学习笔记--解释器模式