第08天 使用Qt Creator调试程序
今天要学习的案例对应的源代码目录:src/chapter02/ks02_05。本案例不依赖第三方类库。程序运行效果如图2-39所示。
图2-39 使用Qt Creator调试程序时的运行效果
今天的目标是掌握如下内容。
- 使用Qt Creator调试程序时,将待调试项目设为启动项目。
- 为程序设置命令参数。
- 调试时设置、取消断点,启用、禁用断点,查看当前断点列表。
- 开始调试、停止调试、开始执行(不调试)。
- 逐语句调试、逐过程调试。
- 调试时查看变量的值。
- 添加对变量的监视。
- 查看堆栈。
本节以ks02_05的代码为例,介绍使用Qt Creator 4.11.0调试程序的基本方法。首先应启动Qt Creator并打开待调试的项目或解决方案。
1.使用Qt Creator调试程序时,将待调试项目设为启动项目
启动Qt Creator后,可以选择【文件】|【打开文件或项目】加载指定项目的pro文件从而打开项目。打开pro文件后,单击Configure Porject按钮,对项目进行配置,如图2-40所示。
图2-40 配置项目
Qt Creator可以同时加载多个项目,因此,首先应确定启动哪个项目进行调试。如图2-41所示,如果希望调试ks02_05项目,可以在Qt Creator中Debug视图的【项目】窗口中选择ks02_05项目进行右击,在弹出的菜单中选择【将"ks02_05"设置为活动项目】。
图2-41 设置活动项目
注意:将DLL项目设置为启动项目时,如果未设置项目的启动命令(调用该DLL的EXE程序),那么在调试时会提示无法启动该DLL,如图2-42所示。此时,可以单击【浏览】选择启动命令。为项目设置启动命令的另一个方法是在【项目】视图的Active Project下拉列表中选择待调试的项目,如图2-43所示,单击Run按钮,然后在【运行设置】中的Executable中输入EXE名称(可以含路径),或者单击【浏览】按钮进行选择。
图2-42 无法启动DLL
图2-43 为DLL项目设置启动命令
2.为程序设置命令参数
设置好启动项目后,接下来需要确定程序的命令参数。如图2-44所示,如果需要为程序设置命令参数,应该在Command line arguments后的行编辑器中输入命令参数。本次调试设置的命令参数为:-term -f c:/config/custom.xml。这相当于用如下方式启动程序:ks02_05_d -term -f c:/config/custom.xml。
图2-44 设置调试用的命令参数
3.调试时设置、取消断点,启用、禁用断点,查看当前断点列表
如果程序一直处于高速运行状态,开发人员仅能通过查看日志或者是程序界面中的数据来观察程序的运行状态。但是这种方法只能查看日志或界面中显示的内容,如果希望查看程序中某个变量的当前值,通过日志或界面进行查看的方法就行不通了。此时,可以为程序设置断点和中断条件,当程序产生中断后,Qt Creator就会把程序的状态保持住,这样再通过Qt Creator提供的手段查看变量的值即可。如果没有其他条件,仅仅希望程序中断,可以直接在期望中断的代码位置设置断点,方法是单击代码行,在该行代码左侧的灰色框位置单击,即可设置或取消断点(单击可设置断点,再次单击则取消断点),如图2-45所示。如果希望当满足某个条件时才在指定代码处产生中断,可以为断点设置中断条件,方法是右击该断点,在弹出的菜单中选择Edit Breakpoint(见图2-46),然后会弹出Edit Breakpoint Properties界面,如图2-47所示,在Condition处编写触发中断的条件即可。当程序执行到该行代码处并且满足中断的触发条件时,将触发中断,此时就可以进一步查看堆栈或变量的值以便进一步分析。
图2-45 设置、取消断点和设置、禁用断点
图2-46 断点设置右键菜单
有时候,需要暂时禁用某些断点,通过右击断点,在弹出的菜单中选择Disable Breakpoint/Enable Breakpoint菜单项可以实现禁用/启用断点的功能。如果希望删除某个断点,可以右击该断点后,在弹出的菜单中选择Remove Breakpoint即可。如果想查看所有断点,可以在Breakpoints窗口中查看。如果想删除所有断点,可以在Breakpoints窗口中右击,在弹出的菜单中选择Delete All Breakpoint,如图2-48所示。
图2-47 为断点添加条件
图2-48 【断点】窗口
4.开始调试、停止调试、开始执行(不调试)
做好前面的准备工作后,就可以开始调试了。如图2-49所示,选择【调试】按钮就可以启动调试,或者选择主窗口菜单中的【调试】|【开始调试】|Start debugging of startup project来启动调试。启动调试的默认快捷键为F5。当发生中断后继续调试程序时方法同启动调试一样。另外,还可以选择不调试而直接执行目标程序,方法是选择【构建】|【运行】。
图2-49 使用工具栏按钮启动调试器
5.逐语句调试、逐过程调试
启动调试后,调试器会在满足中断条件时停在断点处。此时,可以查看堆栈或变量的值,然后选择继续调试。继续调试时,可以使用逐语句调试或逐过程调试。逐语句调试指的是把代码一句一句进行调试,即每调试一步只执行一句代码,方法是选择【调试】|【单步进入】,默认快捷键是F11;逐过程调试指的是以函数为单位进行调试,即每调试一步执行一个函数,方法是选择【调试】|【单步跳过】,默认快捷键是F10。当希望程序执行到某行后立刻中断,而且不希望临时添加断点时,可以在希望中断的代码行处单击,然后选择【调试】|【执行到行】,默认快捷键是Ctrl+F10。
6.调试时查看变量的值
启动调试的一个重要目的是检查程序的运行状态,通过查看变量的值可以检查程序的运行状态。只有在调试会话期间,才可以查看变量的当前值。查看变量的当前值有以下几种方法。
(1)直接把鼠标悬浮在变量上方,QtCreator会显示该变量的值,如图2-50所示。
图2-50 鼠标悬浮在变量上方时显示变量的当前值
(2)在Locals窗口中,可以查看当前栈内可见或改变的数据,如图2-50所示。
7.添加对变量的监视
如果需要查看的变量不在当前中断的函数内,可以事先将变量添加到Expressions表达式监视窗口。这样就可以查看不在当前函数内的变量值了。有两种方法可以实现对变量的监视:一种是将变量直接拖放到Expressions窗口;另一种是右击Expressions,在弹出的菜单中选择Add New Expression Evaluator添加表达式。
8.查看堆栈
有些情况下,需要查看当前代码的堆栈调用情况。所谓堆栈,就是函数之间的调用关系,也就是当前的函数是被哪个函数调用的。如图2-51所示,从Stack(堆栈)窗口可以看出函数的调用关系:当前处于CommandProc()行104,它是被第2级别的main()函数中行号85处代码调用的,也就是main()函数在源代码文件的第85行代码处调用了CommandProc()。
图2-51 调试中的堆栈