【精华】掌握Qt调试技术

前言

软件调试,是开发过程中必备的技能。通过调试可以发现软件存在的bug,即缺陷。调试可以帮助开发者窥探到软件运行过程中的详细状态,从而为消除bug提供重要信息。调试的英文是debug,前面的de在英文中表示“反对”,“消除”。本文将会介绍日常开发中常用的、也是一名合格的Qt开发人员需要掌握的Qt软件基本调试方法,并结合不同场景加以说明,帮助读者查漏补缺,打牢基本功。

常用调试方法

1. 基本调试方法

1.1 以调试启动

以调试启动,是指软件在启动的同时,调试也随即开始。
在Qt项目中,点击Qt Creator左下角调试按钮,如下所示,即可以调试启动:
Qt以调试启动按钮
在VS中调试启动按钮为:
在这里插入图片描述
以调试启动是最常用的调试方法,因为它可以对软件启动到退出的全过程进行调试,所以是调试的首选方法,适用于绝大多数场景。

1.2 附加到进程

附加到进程是另外一种比较常用的调试方法,它是指在软件无调试启动一段时间后,再将调试器挂载到应用程序中进行调试。这种方法通常在以下场景使用:

  • 场景1:
    如果软件启动速度较慢(启动慢的原因很多,比如加载资源、加载插件等等)。调试本身就会使软件变慢,以调试启动,会导致软件启动速度更慢。而采用附加到进程的调试方法,可以在软件启动后,再调试软件,节省时间。但是如果你需要调试的代码段只在软件启动时刻执行一次,那就无法用此种方法,只能使用以调试启动的方法来调试。
  • 场景2:
    在软件是由windows批处理启动时,一般需要使用附加到进程的方法调试。
    通常使用批处理启动软件,是为了配置软件的启动环境,或进行一些启动前的预处理步骤。因为在开发环境中,启动软件仅仅能够配置命令行参数而已,无法进行复杂的环境配置,所以就无法直接以调试启动的方法调试。可能有的同学说,直接调试批处理文件是否可行,答案是不行,感兴趣的同学可以自己尝试。那么这样一来就只有使用附加到进程的方法调试了。

附加到进程,在Qt Creator中,选择菜单“调试”->“开始调试”->“关联到运行中的程序”,随后在弹出的进程列表中选择需要调试的进程即可,如下图所示:
请添加图片描述
在VS中,在菜单中选择“调试”->“附加到进程”,在弹出的进程列表中选择需要调试的进程即可,如下图所示:
请添加图片描述

1.3 启动后再调试

启动后再调试严格来说也是附加到进程。在Qt中,当软件启动后,可以点击下图所示的按钮,直接附加到进程调试:
请添加图片描述
这里就不再赘述。

2. 远程调试

远程调试用于通过网络对另外一台电脑上运行的软件进行调试。
通常用于以下场景:

  • 场景1
    假设目标电脑为实际运行环境。且不能安装开发环境,可能的原因有:目标电脑版本较老、性能较差、不具备安装开发环境的条件,抑或是时间紧急,没有时间安装配置开发环境。
    但是目标电脑可以接入网络,包括局域网和广域网。这种情况下可以在目标电脑上启动调试服务器;在自己的开发电脑上,在VS中使用源码实现远程调试。

调试服务器,又叫远程调试器,Remote Debugger,本地 VS 安装目录下的找到msvsmon.exe,拷贝到目标电脑上运行。

随后在目标电脑上配置调试服务器,包括监听端口、防火墙等。
在调试电脑上的VS 工程中,打开项目属性,点击调试选项卡,切换到远程 Windows 调试器进行配置。具体的配置过程,限于篇幅这里不再赘述,大家可自行搜索。

需要强调的是,发布的debug版本的软件一定要包含.pdb文件,即调试信息文件,它包含了符号的位置信息,用于定位源码,无pdb文件将无法调试。

3. windbg调试

windbg调试是指使用windbg调试软件在目标电脑上进行调试,这种调试方法的优点是不需要安装开发环境,不需要连接网络。只需要将目标电脑上运行的软件对应的源码,以及和目标电脑对应位数、版本的windbg软件拷贝到目标电脑上即可。

windbg调试时,需要进行源码目录配置等操作。windbg支持单步执行,执行到指定位置、查看变量、附加到进程等诸多功能,基本包含Qt/VS中的调试功能,甚至更加强大。当然,使用windbg调试需要一定的学习成本,因为其只在特定的场景下使用,一般只需要在用的时候根据网络上的教程现学即可。

和上面一样,被调试的软件必须含有.pdb文件,否则无法调试。

4. 仅日志调试

上面说的调试方法,都是使用调试器进行调试,可以看到软件运行时的详细信息。但是上述方法的缺点是必须需要和运行的目标软件建立某种连接。而日志调试不需要建立实质性的连接,日志仅仅为软件运行过程中调试信息的记录文本。日志调试需要先打印出重要的运行信息,在排查软件问题时,通过分析日志记录,推断出软件出现问题的原因。日志调试是一种在软件开发后期最省时省力、成本最低的调试方法。但是实现日志调试是一种从编写软件的第一行代码开始就进行的长期、持续的工作。编写代码时,在重要的位置上打印出重要的信息,是实现日志调试的必要工作。

Qt中提供了日志输出机制。如qDebug()、qInfo()、qCritical()、qFatal(),用于向控制台打印信息,当然也可以重定向输出到文件,后面的文章会加以说明。除此之外还有断言Q_ASSERT,可以在调试版本的软件运行时,在关键位置进行条件校验,校验失败时,弹出对话框提示并指明错误代码位置。

日志调试在软件中是必不可少的存在,任何一个良好的软件都会有日志记录。从另一个角度看,在编码过程中,我们要培养打印日志的好习惯,这也是提高编码水平的重要内容。

调试场景

1. 开发阶段调试

因为开发阶段一般环境准备比较充分,大部分时间使用调试器进行调试,包含上面提到的基本调试方法、远程调试方法、windbg调试方法。使用调试器调试可以直接看到内存变量、程序执行位置、对执行进行控制,可以快速定位问题。

软件调试不是目的,软件在设计和编码阶段要充分考虑各种输入输出情况,对异常的处理分支不能不管不问,不可图懒省事,要对软件质量负责,这是开发者的本职工作,是减少软件缺陷的关键。我们不仅要学习调试技术,还要建立起对软件正确的态度,成为一名合格的工程师。

2. 部署、维护阶段调试

部署维护阶段,因为部署维护时的软件运行环境会发生巨大变化,可能因为种种原因,调试会出现困难。这要求我们掌握并灵活运用多种调试手段,根据实际情况选择合适的调试方法,或者综合运用各种调试方法。在不具备调试条件时,通过协商、沟通创建必要的调试环境,最后解决软件问题,防止因软件问题产生损失,这会给我们带来很大的成就感。

结语

本文对笔者在工作中关于软件调试的一些经验方法进行了系统的总结,希望对想要做出优秀软件的同学有所帮助。

大家如有任何疑问,欢迎评论交流。

本文由微信公众号“Qt未来工程师”原创发布。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ps海报合成教程_如何利用PS制作海报?详细教程来了!

今天能学长给大家带来一套利用PS做【月满中秋】海报的教程。福利干货到,请大家接住!话不多说,直接上教程【月满中秋-第一课】月满中秋-海报制作教程https://www.zhihu.com/video/1187797197951918080为了方便大家阅读,本篇文章特地…

【转】WebSocket详解(一):初步认识WebSocket技术

1、前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大意义。 本文将带您认识WebSocket。也可查看本文的下篇&#x…

【Qt调试技巧】Profile配置使用及一些坑

介绍 不知从哪个版本起,Qt Creator中的构建配置中,增加了一种新型配置,名叫“Profile”,如下图所示: 官方对Profile的描述是:Profile是介于Debug和Release中间的一种配置。具体是什么意思呢?…

python 语句简写_自学Python-语句之列表推导式

先举例分析运行过程:例如:#将list_a[1,2,3,4,5]元素扩大10倍,生成新的列表。如果按传统的for循环来写:--------------------list_a[1,2,3,4,5]list_b[]for x in list_a:list_b.append(x*10)print(list_b)输出:[10, 20,…

Qt中使用OpenSSL

概述 OpenSSL官网 OpenSSL官网:OpenSSL是一个开源跨平台的加密库,应用广泛。Windows提供了自己的一套加密认证API,感兴趣的话可以参考:Windows Authentication Overview。 Qt官方文档: Secure Sockets Layer (SSL)…

【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程

上一篇文章带你玩转Visual Studio——带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途。由于这里包含的工程类型太多,有很多本人也没有接触过,有些可能理解的不太对的地方还请…

数学学习过程中的感悟(一)

前言 最近在考研复习,回顾自己的学习数学的过程,有一些感悟,在此记录一下。 正文 大学的时候,学习到了高数,但是接触不久就丧失了兴趣。明明中学时代还很喜欢学习数学,为什么到了大学,一点兴…

如何调整金格电子章服务器印章_重磅!公安部再度认可电子签名、电子印章法律效力!...

近日,公安部发布《关于修改〈公安机关办理刑事案件程序规定〉的决定》,对《公安机关办理刑事案件程序规定》(以下简称规定)进行了全面修改完善,并将于9月1日起施行。修改后的规定共14章388条。其中,新增的第…

【转】带你玩转Visual Studio——04.带你高效开发

上一篇文章带你玩转Visual Studio——带你了解VC各种类型的工程一文中讲了各种类型VC工程的主要功能和用途。现在将带你一起快速开发c程序。 有过Java开发经验的人都知道Java的常用开发工具(如Eclipse、Intellij IDEA等)都有非常强大的关键字高亮、智能提示、快速追踪等的功能…

python编译make_Python在Linux下编译安装

【准备环境】Linux centos【前言】1 linux下默认带Python,带的是2.7版本的 ,如果需要升级版本,需要把系统的自带的Python改名或者卸载,再次安装你所需要的Python版本,centos下由于yum依赖自带的Python2.7,所…

【信号与线性系统】知识点与学习攻略

知识点理解 关于正交分解可以看这个视频: https://www.bilibili.com/video/BV1qV411C7u6/ 记住两个完备正交函数集: 一个是正余弦三角函数,非零不同频率项乘积为0,非零同频率项乘积积分为T/2,零频率项乘积积分为T。 一…

【转】C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)

在使用 TcpClient 网络连接中常常会发生客户端连接异常断开, 服务端需要设置检测手段进行这种异常的处理; 1、对于短连接, 通过对 Socket 属性ReceiveTimeout 和 SendTimeout 设置恰当的值, 使得程序在进行读/写时超时, 会产生 SocketException 异常, 通过检查这个…

python 几何教学_opencv-python教程学习系列11-几何变换

前言opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍几何变换,坚持学习,共同进步。系统环境系统:win7_x64;python版本:python3.5.2;opencv版本:opencv3.3.1&#xff1b…

【数学+编程】对数学函数进行抽象

目的 将数学函数抽象为类。 类名 函数 属性 基本属性 表达式定义域值域周期性、单调性等特性 方法 求值:返回值平移:返回新的函数伸缩:返回新的函数反转:返回新的函数复合:参数为另外一个函数,返回…

2020-12-19

逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画…

【数学】定积分和不定积分的区别

不定积分的研究对象是某函数下的映射关系积分后,得到怎样的新的映射关系。 定积分的研究对象是积分的值。

微软模拟飞行10厦门航空涂装_《微软飞行模拟器》多人游戏模式演示:可组队飞行...

IT之家3月29日消息 《微软飞行模拟器》(Flight Simulator)是2020年最受期待的游戏之一,开发商Asobo Studio现在分享了一段新的视频,详细介绍了《微软飞行模拟器》的多人游戏模式。《微软飞行模拟器》游戏的主模式将看到所有玩家在同一个世界中一起玩。微…

【信号与系统】系统特性

系统 系统就是一个包含f(t)、y(t)及其衍生函数(如导数,复合函数)的方程。 所以在你看到一个方程的时候,第一反应是: 方程描述了一个系统,在时刻t,可以把f(t)变成y(t)。如何变的呢?由…

【转】UDP协议格式以及在java中的使用

UDP协议格式以及在java中的使用 UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。 UDP适用于…

python网页填表教程_PythonSpot 中文系列教程 · 翻译完成

原文:PythonSpot Python Tutorials 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。在线阅读ApacheCN 学习资源目录PythonSpot 中文系列教程初学者 介绍Python 字符串字符串&#xff0…