一、简介
预备工具和知识:使用使用VSCode使用Debug。
本文简介:本文将简要介绍debug中Continue
,Step Over
,Step Into
和Restart
的功能。并介绍如何在debug时查看动态内存地址(指针)的值;
二、Debug介绍
1. 设置断点:
- 设置普通断点:
使用鼠标在编辑框左侧左击即可设置一个断点
,当在debug模式夏运行时当程序运行到此处会停下。
如下图所示:
使用debug模式运行,程序运行到断点
处会暂停,如下图所示。
- 设置条件断点:
我们可以设置一些条件断点
,指定在特定条件下断点
生效。例如,我们在int b = 1;
处设置一个断点,并设定当a==1
时,该断点生效。
首先我们在第7行处设置一个普通断点
,然后右击断点
,选择Edit Breakpoint
,再在编辑框里输入a==1
如下图所示:
此时只有当变量a
等于1时,第7行的断点才生效(此时代码中a==0,不满足条件,因此此断点不生效)。我们依旧选择debug模型运行程序,结果如下:
我们会发现,此时程序会直接运行结束,不会在断点处暂停。假如我们将代码中的第6行改为:int a=1;
,令变量a
等于1,再运行一次,会发现程序在断点处暂停了。这说明我们设置的条件断点
只有当a==1
时才生效。
2. Debug各按钮介绍:
Continue
:当在前一个断点
处暂停时,点击Continue
会继续运行程序,并在下一个断点
处(如果有下一个断点
,并能运行到该断点
处的话)暂停。Step Over
:单步执行:若当前行为函数,则会直接运行完当前行的函数,不进入该函数内部。若当前行为其他语句,则直接运行完当前行语句。并在下一行处暂停。Step Into
:单步执行:若当前行为函数,则会进入该函数内部继续单步执行。若当前行为其他语句,则直接运行完当前行语句。并在下一行处暂停。Step Out
:若此时是经过Step Into
到某子函数内部时,点击Step Out
会直接运行完当前子函数,并跳转到上次函数处继续单步执行。若在此之前没有经过Step Into
,则该功能无效。Restart
:重新运行程序。
三、查看动态分配的内存变量
在debug时,对于简单变量、数组变量可以在左侧的VARIABLES窗口里看到变量的值,但是对于指针类型的变量我们只能看到指针的值(地址),不能看到指针所指向的内存位置里的值。如下图所示:
从上图中可以看出,对于简单变量a
和数组变量b
可以直接查看内存中的数值,而对于指针p
只能看到其中的的地址,无法看到指针指向的地址里的数值。
我们可以使用以下两种方法查看指针p
指向位置处的内存值:
1. 使用*pointer@size查看指针处的值
在VARIABLES窗口处右击p
,点击Add to watch
,点击完完成后会在WATCH
窗口里显示此时正在监视
变量p
,如下图所示:
然后在WATCH窗口右击p
选择Edit Expression
,将p
修改为*pointer@size
的格式,由于申请p
时申请了5个int型变量的内存,因此size=5
。那么我们将WATCH窗口中的p
改为*p@5
,如下图所示,即可查看p
指向的内存处的值:
2. 使用*(type(*)[size])pointer将指针转为数组变量
我们也可以将指针p
强制转为数组类型,然后查看p
处内存的值。与前面类似,只不过此时需要将WATCH里的p
改为*(type(*)[size])pointer
格式,对于int* p=int[5]
,我们需要改为*(int(*)[5])p
,如下图所示,可以看到使用该方法也可查看p
指向的内存处的值:
四、参考引用
[1]. debug 调试——step over、step into、step out 的区别
[2]. VScode调试c代码时,如何显示动态分配的指针数组