要查看程序执行到特定位置时的状态,最好当然是能够让它执行到那个位置的时候暂停下来。我们想看什么,就可以看什么。为此,小熊猫C++提供了一系列控制程序执行的功能。
1 启动调试
通过“运行”菜单或者调试工具栏,点击“调试”,就可以让当前程序以调试模式启动运行。当前程序中如果没有断点,则程序启动后会自动停在main()函数的第一条语句处(变量声明除外),如下图所示(注意当前暂停位置所在行左侧的小箭头):
2 退出调试
在程序调试过程中,通过“运行”菜单或者调试工具栏,点击“停止执行”按钮,即可停止调试。
3 断点
断点(Breakpoint)就是程序中预设的暂停点。程序在调试运行到断点位置时,就会暂停。
在小熊猫C++中,单击编辑器左侧边栏区域即可设置/取消断点:
设置断点后点击”调试“按钮启动调试,程序就会在断点所在的第22行暂停。注意:程序在运行第20行的scanf语句时,会等待用户输入一个整数,这是scanf语句本身的行为特性,和调试没有任何关系。
4 单步执行
顾名思义,单步执行就是让程序执行一步后暂停。问题在于,到底多少程序算”一步“?在小熊猫C++的运行菜单中,有这么几种单步执行:
- 单步跳过(Step Over):一行程序算一步。执行完当前行后暂停。
- 单步进入(Step Into):如果当前行不包含函数调用,则一行程序算一步;如果这行程序中包含对函数的调用,会在进入函数后暂停;如果找不到该函数的符号信息,则在执行完该函数后暂停。
- 单步跳出(Step Out):退出当前函数后暂停。
4.1 单步跳过
在上一节中,程序在我们输入300后,暂停在了第23行断点处。注意这一行中包含了对函数isPrime()的调用。并且注意此时变量i的值为2(2是质数)
如果此时(程序暂停在23行时)点击”单步跳过“,程序会在执行完23行后,停在第24行
4.2 单步进入
让我们退出再重新开始调试,输入300后程序再次暂停在了23行断点处。如果此时(程序暂停在23行时)点击”单步进入“,程序会停在第9行isPrime()函数的入口处:
4.3 单步跳出
我们现在暂停在了函数isPrime()中。现在点击”单步跳出“按钮,程序会返回第23行(isPrime(i)函数执行完了,但是if判断还没执行)
在小熊猫C++的CPU窗口中,还有两个单步执行按钮:”单步执行一条机器指令“和”单步进入一条机器“指令。有兴趣的同学可以猜一猜,然后自己试试它们的作用是什么?
5 继续执行
程序暂停后,通过”运行“菜单或者调试工具栏选择”继续执行”,程序就会继续以调试方式运行,直到遇到下一个断点,或者程序运行结束为止。
接上一节的例子,点击“继续执行”,程序又会停在第23行断点处。但注意此时i的值已经变成了3
6 GDB Server调试模式
为了支持在Linux下使用终端调试程序,从0.12.5版本开始,小熊猫C++中新增了gdb server调试模式(在Linux下自动缺省启用,目前在Windows下缺省关闭)。可以通过工具菜单的“选项”菜单项打开选项对话框,然后在选项对话框的“调试器”“通用"页中设置是否启用gdb server调试。
7 中断(仅gdb server模式下支持)
在gdb server模式下,运行菜单和调试工具栏中会多出一个“中断”按钮。此按钮可以暂停运行中的程序。但是由于此时程序可能正在执行某个运行库中的指令(比如,输出内容到控制台窗口),所以小熊猫C++无法在编辑器窗口中获取和显示程序当前暂停的位置。
在Linux操作系统下可以通过调用栈视图了解程序当前的状态。但是Windows下小熊猫C++后台使用的gdb程序尚无法在中断后获取完整的调用栈信息。