Visual Studio中的常用调试功能(上)

1、利用断点进行调试

添加断点的方式有以下几种

  • 1.键盘快捷键F9
  • 2.通过菜单【Debug(调试)】-》【Toggle BreakPoint(切换断点)】
  • 3.点击代码行左边的空白处(推荐)

设置断点后,按F5运行程序,当运行到断点处时就会暂停

此时可以 按F10逐过程或F11逐语句执行后面的程序语句

2、条件断点

条件断点会在条件触发时断点才生效。

假设有以下代码(C#):

循环输出 i,

复制代码
1  static void Main(string[] args)
2         {
3            for(int i = 0;i<100;i++)
4             {
5                 Console.WriteLine(i);
6             }
7         }

如果我们想在i == 50的时候进入断点,可以这么操作

1.按【利用断点调试】中的方法建立断点

2.在断点上右键,选择,条件。输入 i == 50

3.按F5运行程序,当i = 50时,程序会暂停进入断点。

3.数据断点(限C++ Native)

数据断点可以对指定变量进行监控,程序运行到变量值发生变化 时进入调试状态。

注意:

1、数据断点在程序执行后,才可以添加。

2、数据断点只能对全局变量进行监控

创建C++控制台应用程序

复制代码
 1 #include <iostream>
 2 
 3 int b = 0;
 4 
 5 int main()
 6 {
 7     std::cout << "Hello World!\n";
 8 
 9     b = 100;
10 }

我们在第7行处添加一个普通断点,按F5执行程序。

当运行到第7行进行断点时,通过快速监视功能,获取变量b的地址。

然后通过菜单

Debug(调试)-》New Breakpoint(新建断点)-》Data Breakpoint(数据断点),打开数据断点窗口。输入变量b的地址,单击确定

也可以通过将变量b添加监视

然后在监视窗口中变量b的选项中选择值更改时中断

这样当变量b的值在更改时,就会触发断点

4.监视功能

将变量添加到监视后可以实时查看变量的变化。监视功能在调试全局变量时非常有用,可以实时查看变量的值。

通过调试-》窗口-》监视-》监视1,可以打开监视窗口。

将变量添加到监视后,可以实时查看变量值的变化

测试代码如下:

复制代码
1 int main()
2 {
3     int num = 0;
4 
5     for (int i = 0; i < 100; i++)
6     {
7         num++;
8     }
9 }

在num = 0处和num++处添加断点,按F5执行程序,将num添加监视。

然后多次按下F5,可以看到num的值在变化。

5.快速监视

快速监视简单来说就是执行单次监视功能。可以查看代码执行到当前位置时,变量的值,还可以执行表达式。

快速监视可以方便我们在运行时,对变量执行相关操作,并且马上可以看到结果。如有一个DataTable dt,我们想查找第一行某一列的值,如果单独编写代码来完成,费时又费力,这时就可以借助快速监视功能,在表达式框中输入 dt.Rows0"xx,再按下回车就可以看到结果。

这里我们对num执行快速监视,可以看到当前的值是32

执行表达式,如 num + 100,按下回车,可以看到值是132

6.调用堆栈

使用调用堆栈功能可以查看函数调用的层次结构。

通过调试-》窗口-》调用堆栈可以打开调用堆栈窗口

测试代码如下:

复制代码
 1 #include <iostream>
 2 #include<Windows.h>
 3 
 4 void func2()
 5 {
 6     
 7 }
 8 
 9 void func1()
10 {
11     func2();
12 }
13 
14 
15 int main()
16 {
17     func1();
18 }

在func2函数中,添加一个断点,按F5执行程序。打开调用堆栈,可以看到函数的调用层次

此时双击调用堆栈中的调用层次,可以跳转到调用的地方 。

当程序抛出异常时,也可以打开调用堆栈,然后定位到引发异常的函数,并进行修改。

7.查看内存里的数据

在日常开发中,经常会需要进行数据的传递,一般会传递一个指针变量。而有时会因为某种原因而导致部分数据出错。在排查问题时,就 可以使用内存窗口

通过调试-》窗口-》内存-》内存1,可以打开内存窗口。

测试代码如下:

复制代码
 1 void PrintArray(int* ar,int size)
 2 {
 3     for (int i = 0; i < size; i++)
 4     {
 5         std::cout << *ar << std::endl;
 6         ar++;
 7     }
 8 }
 9 
10 int main()
11 {
12     int ar[]{ 1,2,3 };
13     PrintArray(ar, 3);
14 }

假设我们拿到了一直int指针,想查看指针指向的内存里的数据。如上面的ar,

在PrintArray函数中,添加断点,按F5执行程序,当程序执行中断点处时,打开内存窗口

首先复制指针所指向的内存地址

粘贴到内存窗口中,按下回车,可以看到内存里的数据

相关推荐
skywalk81636 小时前
lightplugin项目已经复刻完成了很多插件,还有需要复刻的插件吗? 再复刻12个,另外解决复刻的插件的宽度和广度!
人工智能·调试
sunburn-12 小时前
Java 排序算法详细教学:从冒泡排序到快速排序
java·开发语言·数据结构·ide·算法
Naisu Xu13 小时前
记一次STM32H503冷启动后进入HardFult_Handler的问题
stm32·单片机·嵌入式硬件·调试·内存问题
life码农13 小时前
PhpStorm或Pycharm中 如何从某个位置全选文字到文件末尾
ide·pycharm·phpstorm
神一样的老师14 小时前
RA-Eco-RA4M2-100PIN-V2.0 开发环境:VSCode + FSP 从新建工程到点亮 LED
ide·vscode·编辑器
围炉聊科技15 小时前
你从IDE切到ADE了吗?智能体开发环境赛道地图——智能体基建系列
ide·人工智能
passion15 小时前
CnPack IDE专家包发布1.8.1正式版!
ide·delphi·cnpack
霸道流氓气质15 小时前
Graph Studio Web IDE 深度实战:可视化编排、断点调试与生产级运维全指南
运维·前端·ide
凉茶钱1 天前
【吃透C++】static、友元、内部类、匿名对象与拷贝编译器优化全解析
c++·青少年编程·visual studio
阿伟玩不懂1 天前
接入第一个 MCP Server:让 AI 自己看你的数据库
ide·人工智能