QT调试详细操作步骤及案例分析

QT调试详细操作步骤及案例分析

第一次尝试写博客,我也会尽量写的详细一些…
写博客的目的一个是将自己所学独立总结一下,方便以后自己回顾,另外也希望能给大家一些帮助~

QT调试详细步骤

1. 手动调试

1.1 输入备调试的代码

1.2 设置断点

在行号左侧的空白处点击一下,产生一个“红圆点”,即设置断点。所谓断点,就是程序运行到该行代码时会暂停下来,从而可以查看一些信息,如变量值等。要取消断点,只要在那个断点上再点击一下就可以了。
设置断点

1.3 单步调试简单介绍

  • 单步跳过(F10)
    一次执行一条语句,遇到函数不进入,直接单步得到函数执行的结果。需要说明一下,对于QT程序,程序会跳转到QWidget类的x()函数的源码处
  • 单步进入(F11)
    按照顺序进入所在行调用的函数内部,一般使用单步进入后配合单步跳过 使用,查看函数内部逐条语句的执行情况以及各个变量值的变化。
  • 单步跳出(shift + F11)
    在函数运行完后,退出该函数,回到调用该函数的语句的下一步。需要说明一下,对于QT程序的类函数源码,按下“单步跳出”按钮可回到原来的断点处。

在debugger的菜单栏中也有相应的图标,分别对应上述操作:
调试button

  • 停止调试: 调试关闭,进入平常的编码模式;
  • 继续调试: 当计算器无法独立进行调试(比如需要键盘输入、弹出窗口等操作前调试无法正常进行),这时需要点击继续调试,使得调试正常进行;另外,当程序在断点处停了下来,按下继续按钮后,程序便会像正常运行一样,执行后面的代码,直到遇到下一个断点,或者程序结束。

(左边为 继续调试 图标,右边为 停止调试 图标)
调试button_2

1.4 调试案例

1.4.1 纯C++代码的调试

下面是一个简单的纯C++代码的调试过程:

源代码:

#include <iostream>
using namespace std;

//从begin_num开始累加,加到第num个数字
int function(int start,int num){
    int sum;
    for(int i=0;i<num;i++){
        sum += (start + i);
    }
    return sum;
}

int main(int argc, char *argv[])
{
    int sum = 0;

    //从begin_num开始累加,加到第num个数字
    int begin_num = 4;
    int num = 5;

    for(int i=0;i<num;i++){
        sum += (begin_num + i);
    }

    int sum1 = function(begin_num,num);

    cout<<sum<<'\n'<<sum1<<endl;
    return 0;
}

运行结果:
在这里插入图片描述
明明是相同的代码为什么最后的运行结果不一样呢?一般这种逻辑错误都需要进行调试分析来找出错误所在;

step1 我们先设置一个断点,在开始调试,在右侧我们可以看到当前mian函数中定义了的几个变量的值,当我们逐条语句进行时,就能看到他们随着语句执行值的变化。
在这里插入图片描述
step2 使用单步跳过
当单步跳过两次,执行了两条赋值初始化语句后,begin_num与num的值发生变化;
在这里插入图片描述
接下来我们看在for循环语句中相应变量值的变化:
第一次循环:
在这里插入图片描述
第二次循环:
在这里插入图片描述

第五次循环后的结果:
在这里插入图片描述

step3循环结束,此时我们用单步进入看看函数function()中语句执行情况:
在这里插入图片描述
在这里我们可以发现,sum在声明后并没有初始化,所以我们最后通过函数得到的sum1值比较奇怪。
就是通过这样类似的操作,我们可以将运行过程中变量的值与我们预想中的值作对比,来找出程序中的逻辑错误。

1.4.2 QT程序的调试

源代码:

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget widget;
    int x = widget.x();
    int y = widget.y();

    QRect geometry = widget.geometry();
    QRect frame = widget.frameGeometry();
    widget.show();
    
    return a.exec();
}

(1)然后开始调试:
在这里插入图片描述
注意:此时需要点击继续调试!(当继续调试图标亮着并且其他操作无效时,需要考虑点击继续调试),继续后直接跳到断点位置。
在这里插入图片描述
(2)点击单步跳过,发现x,y的值变为0,这是为什么呢?
在这里插入图片描述
现猜想可能是窗口没有显示的原因,那么就更改代码,让窗口先显示出来,再看这些值。如下图,此时窗口显示出来,x,y也有了相应的值。
在这里插入图片描述

2. 使用QDebug进行自动调试

2.1 简单介绍

一般在程序调试过程中很常用的是qDebug() 函数,它可以将调试信息直接输出到控制台,在Qt Creator中是输出到应用程序输出栏 。
使用qDebug()函数进行调试,要现添加 #include <QDebug> 头文件。然后这里使用了两种输出方式:

方式一:直接将字符串当做参数传给qDebug()函数,例如下面使用这种方法输出x和y的值。

方式二:使用输出流的方式一次输出多个值,它们的类型可以不同。例如程序中输出geometry和frame的值。

2.2 调试案例分析

源代码:

#include <QApplication>
#include <QDebug>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget widget;
    
    widget.resize(400, 300);       // 设置窗口大小
    widget.move(200, 100);         // 设置窗口位置
    widget.show();
    int x = widget.x();
    qDebug("x: %d", x);            // 输出x的值
    int y = widget.y();
    qDebug("y: %d", y);
    QRect geometry = widget.geometry();
    QRect frame = widget.frameGeometry();
    qDebug() << "geometry: " << geometry << "frame: " << frame;
    
    return a.exec();
}

在这里插入图片描述
使用QDebug进行自动调试,其实就是我们通过函数把自变量的值输出,以供我们与预期值进行对比。

总而言之,以上两种手动调试与自动调试都是让我们看到变量值的变化,随后我们将其与预期值对比,通过数据直观地测试我们的程序是否出错,并方便我们准确地找到bug所在的语句或语句块。

发布了3 篇原创文章 · 获赞 2 · 访问量 469

猜你喜欢

转载自blog.csdn.net/lllalaaaa/article/details/95066223
今日推荐