目录
QT调试详细操作步骤及案例分析
第一次尝试写博客,我也会尽量写的详细一些…
写博客的目的一个是将自己所学独立总结一下,方便以后自己回顾,另外也希望能给大家一些帮助~
QT调试详细步骤
1. 手动调试
1.1 输入备调试的代码
1.2 设置断点
在行号左侧的空白处点击一下,产生一个“红圆点”,即设置断点。所谓断点,就是程序运行到该行代码时会暂停下来,从而可以查看一些信息,如变量值等。要取消断点,只要在那个断点上再点击一下就可以了。
1.3 单步调试简单介绍
- 单步跳过(F10)
一次执行一条语句,遇到函数不进入,直接单步得到函数执行的结果。需要说明一下,对于QT程序,程序会跳转到QWidget类的x()函数的源码处 - 单步进入(F11)
按照顺序进入所在行调用的函数内部,一般使用单步进入后配合单步跳过 使用,查看函数内部逐条语句的执行情况以及各个变量值的变化。 - 单步跳出(shift + F11)
在函数运行完后,退出该函数,回到调用该函数的语句的下一步。需要说明一下,对于QT程序的类函数源码,按下“单步跳出”按钮可回到原来的断点处。
在debugger的菜单栏中也有相应的图标,分别对应上述操作:
- 停止调试: 调试关闭,进入平常的编码模式;
- 继续调试: 当计算器无法独立进行调试(比如需要键盘输入、弹出窗口等操作前调试无法正常进行),这时需要点击继续调试,使得调试正常进行;另外,当程序在断点处停了下来,按下继续按钮后,程序便会像正常运行一样,执行后面的代码,直到遇到下一个断点,或者程序结束。
(左边为 继续调试 图标,右边为 停止调试 图标)
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所在的语句或语句块。