一、简介
预备工具和知识:使用使用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指向的内存处的值:
![使用*(type(*)[size])pointer格式查看指针处内存的值](https://img-blog.csdnimg.cn/direct/42389a0515d941e48a795ab902b2f7d8.png)
四、参考引用
[1]. debug 调试——step over、step into、step out 的区别
[2]. VScode调试c代码时,如何显示动态分配的指针数组