当前位置: 首页 > news >正文

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

8、Visual Studio调试工具栏中的按钮及图标

image

9、逐语句执行(F11)

逐语句(Step Into)执行也称为单步执行,即一行一行地执行程序中的代码。

如果某行代码中调用了一个函数,那么逐语句执行命令就会进入函数中去,而不是跳过函数。

这是在Visual Studio中调试最常用的功能.

demo

10、逐过程执行(F10)

逐过程(Step Over)执行与逐语句执行有一些相似之处。

如果代码行中没有函数调用,那么执行结果是相同的,都是执行完当前代码行,在下一行代码处暂停。

如果当前代码行中有函数调用,逐过程就会跳过函数,不会进入函数内部。

demo

11、跳出执行(Shift+F11)

跳出执行(Step Out)是指跳出当前执行的函数。该功能只有在程序暂停的状态下才可以使用,即正在逐语句或者逐过程执行代码时,跳出执行才有效。

demo

12、运行到光标处(Ctrl+F10)

该命令未在工具栏中体现,只能通过快捷键执行。

“运行到光标处”相当于先在光标处设置一个断点,并执行到此处进行暂停。

不过这只是一个虚拟的断点,不会出现在“断点”窗口中,而且只会作用一次,即执行过后就不再起作用。

demo

 可以看到我将光标定位在ReadCommonDicomTag函数处,然后按下Ctrl+F10,代码就执行到了这里并暂停。

12、禁用断点

在第一篇文章中,我们介绍了如何创建断点。当我们创建断点后,有时候想暂时跳过某些断点,可以通过禁用断点来实现。

我们在断点占单击右键,可以通过菜单禁用断点。也可以通过快捷键Ctrl+F9来实现同样的效果。

image

13、查看所有断点

当我们设置多个断点后,可以通过调试-》断点菜单,查看所有断点

image

image

在这里我们可以查看所有断点,并禁用/启用断点。

14、多次执行同一代码(限C++ Native)

多次执行代码指的是在调试状态下,多次执行某些代码。

image

在调试过程中,我们可以看到行首有一个箭头表示当前要执行的代码位置,它相当于代码执行的指针,这个指针指向哪里,代码就执行到哪里。

可以将该指针移动到期望想要再次执行的地方,代码会执行到指针指向的行,并暂停。

demo

移动执行指针时需要遵循两个基本原则:一是不要移动到函数外;二是不要跳过重要的初始化操作语句。

移动执行指针可能会导致预料不到的结果,这个需要根据代码情况自行分析。

15、查看局部变量

局部变量(Locals)窗口能够查看的变量是当前执行函数的作用域范围内的所有局部变量。

“局部变量”窗口可以通过“调试”→“窗口”菜单下的“局部变量”命令来打开,也可以使用Alt + 4组合键打开。

注意,作用域是函数,包括函数的参数,以及函数级别的所有变量。如果变量是全局的,就不会在“局部变量”窗口中自动显示。

demo

 在局部变量窗口中,我们可以双击值,进行修改

image

16、查看当前栈中的变量

自动(Autos)窗口只能显示当前栈中的一些变量。“自动”窗口可以通过“调试”→“窗口”菜单下的“自动窗口”命令来打开。

“自动”窗口就是自动显示当前调试上下文的变量。比如在刚进入一个函数时,“自动”窗口会显示这个函数的参数值以及全局变量,然后显示这个函数第一行代码所定义的变量,但是不会显示其他变量。

demo

17、即时窗口

在即时(Immediate)窗口中,可以执行调试、计算表达式、执行语句、输出变量的值等操作。

“即时”窗口在调试状态下才可以使用,可通过“调试”→“窗口”菜单下的“即时”命令打开。

这个窗口可以理解为命令行的”快速监视“功能

demo

18、并行监视(多线程调试)

假设我有如下的cpp代码

1 #include <iostream>2 #include <thread>3 #include<vector>4 5 using namespace std;6 7 int cnt = 0;8 9 void threadFunction(void* args) {    
10         int data = cnt++;
11 
12         std::this_thread::sleep_for(std::chrono::milliseconds(3000));  
13 }
14 
15 int main() {
16 
17     std::vector<std::thread> threads;
18 
19     for (int i = 1; i <= 10; i++)
20     {  
21         threads.push_back(std::thread(threadFunction, nullptr));
22     }
23 
24     for (auto& localThread : threads)
25     {
26         localThread.join();
27     }
28 
29     return 0;
30 }

在threadFunction函数中增加一个断点,启动调试后,在断点处停下来。从“调试”→“窗口”菜单中选择“并行监视”命令。

image

在后面的列中我们可以输入想要监视的变量,如上面示例中的cnt和data。

就可以看到每个线程中的值。

image

19、查看错误码

调用Windows API失败时,一般会通过GetLastError函数来获取错误码。

但这里获取的错误码,无法查看具体的错误内容。

可以通过下面两个方法:

一、通过errlook程序

这个程序的路径是"VS安装路径"\Common7\Tools\errlook.exe

image

二、通过err,hr

假设我们打开一个不存在文件

1 #include<stdio.h>2 3 4 int main() {5 6     FILE* fp = nullptr;7 8     fopen_s(&fp, "D:\\a.txt", "r");9 
10     return 0;
11 }

然后或者监视窗口或即时窗口,输入err,hr,就可以看到错误消息。

image

输入err可以看到错误码

image

http://www.dtcms.com/a/338965.html

相关文章:

  • peewee中db.create_tables(tables, safe=True),safe=True作用
  • 【Rust嵌入式键值对数据库redb】第一课 第一次写入
  • Matplotlib数据可视化实战:Matplotlib图表注释与美化入门
  • Kubernetes 的 YAML 配置文件-kind
  • 8.19作业
  • STM32 定时器(中断源)
  • Vibe 编码技巧与建议(Vibe Coding Tips and Tricks)
  • K近邻算法(knn)
  • SpringAIAlibaba之基础功能和基础类源码解析(2)
  • 添加右键菜单项以管理员权限打开 CMD
  • JUC之CompletableFuture【中】
  • [ORACLE数据库] ORACLE 的 PL/SQL 块
  • 开通会话内容存档获取聊天记录
  • 机器学习中的「损失函数」:模型优化的核心标尺
  • 源雀SCRM开源版企微客服功能重磅升级
  • Linux 正则表达式
  • 【新启航】航空飞机起落架深孔型腔的内轮廓检测方法探究 - 激光频率梳 3D 轮廓检测
  • JavaScript 性能优化:new Map vs Array.find() 查找速度深度对比
  • 机器翻译60天修炼专栏介绍和目录
  • C语言:字符函数与字符串函数(1)
  • 从 IP编码地址困局到网络优化:VLSM 与 CIDR 如何破解地址浪费与路由难题
  • 使用 Resilience4j 实现 Spring Boot 服务限流:轻量级容错的最佳实践
  • Java算法之排序
  • Bot 流量“假阳性”调优笔记
  • ListBoxes使得在专为灵活性和易用性设计
  • 消费者API
  • 云电脑 vs 传统PC:全面对比3A游戏与AI训练的成本与性能
  • Leetcode 3654. Minimum Sum After Divisible Sum Deletions
  • 【多模态大模型的三化】
  • [PV]AXI R/W/RW带宽计算的tcl脚本