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

visual studio 的实用调试技巧

一、什么是bug,什么是调试

(一)、bug

bug的原意就是虫子

就是用来表示计算机程序的潜在漏洞。最早起源于美国海军工作的电脑专家格蕾丝-赫伯,他在一次对Harvard Mark 设置好1700个继电器后,开始工作,但是机器运转一会后就停止了,工作人员进入机器内部查看,发现一只受到机器的光和热吸引靠近,被高压电电死的飞蛾尸体,它阻碍了机器运转。于是在当天的工作报告上面,格蕾丝用胶带把飞蛾尸体粘上去,然后记录bug,这就是bug的由来

(二)、调试(debug=delete bug

我们写一个程序,不可避免会有bug的出现,这个时候,我们需要去发现问题,然后解决问题

我们可以通过隔离,逐渐过程运行等方式去发现问题,然后修改代码,然后再运行,再调试,这个过程就是调试

调试一定要去动手做!!!

二、debug和release

debug

debug也就是调试版本,它包含调试信息,没有任何优化,可以供程序员频繁调试,比如可以一步步观察变量的值,地址等等

release

release就是发布版本,它没有包含调试信息,是最优化的,发布给用户使用的版本,它在文件大小,运行速度方面效果更好。但是它不能用于调试,往往是一步到位,监视不了变量的值的变化过程。

三、vs调试快捷键

  1. F9表示断点和取消断点,鼠标放在哪一行,然后按F9就可以设置断点。当程序运行到这里时,就会停下来,方便我们再使用逐语句,或者逐过程来调试

  2. F5表示开始调试。通常和F9配套使用。当我们的断点前有很多代码,我们不可能一个过程一个过程的去看,这时候使用F9设置好断点,然后F5就可以一键跳到断点处。之前扫雷游戏,9 * 9的循环我逐语句按了好几分钟😄

    注意:F5是跳到逻辑上的断点处,而不是物理上看到的下一个断电,如下代码,在for循环中,当我们来到断点a处,然后再按F5,代码并没有运行到断电b,而还是在断点a处,这是因为for循环运行下一次的时候又遇到了断点a,所以停下来了

    #include<stdio.h> int main() { int arr[10] = { 0 }; int i = 0; for (i = 0; i < 10; i++) { arr[i] = i + 1; //断点处a } for (i = 0; i < 10; i++) { printf("%d ", arr[i]); //断点处b } printf("\n"); ​ return 0; ​ }
  3. F10和F11 :F10是逐过程,每按一次,执行一个过程或者一个语句,如函数语句,执行就执行,不会进入函数内部。

    F11是逐语句,每按一次,一定执行严格意义的一条语句,当遇到函数的时候,就会进入函数内部,然后在函数内部一条语句一条语句的执行

  4. ctrl + F5:执行代码但是不调试,如果代码正确,直接运行到代码的结束,中间有打断点也没有用;如果代码错误,则直接报错

四、监视和内存视察

1、监视
  1. 首先是代码开始调试,才可以有监视

  2. 打开调试—窗口—监视—随便选一个窗口就OK,监视可以查看变量的值

2、内存视察
  1. 同样,代码需要先调试起来,也就是按F10或者F11,

  2. 打开调试—窗口—内存—随便选一个窗口就OK。

  3. 窗口如下,左边框表示地址,中间框表示这个地址内 存的值,右边框框表示,根据地址内的值的一个简单的推断,意义不大

  4. 当我们要观察变量时,需要输入取地址符,例如途中的变量i

3、例子
3.1
  1. 在debug,x86环境下执行如下代码,并解决发生的问题特定环境

    #include<stdio.h> int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe \n"); } return 0; }
  2. 程序进入死循环了,调试发现;arr[12]的位置存储的 刚好 (巧合)就 i 的值,执行arr[12]=0,就是把 i 的值变成0,所以代码陷入死循环

    ,如下图

  3. 本质原因:

    • 首先我们要知道,这个代码中的变量 i 和数组都是局部变量,存放在栈区

    • 栈区的存储特点就是从高到低分配地址(x86环境),如图所示,变量 i 先创建,然后再创建数组

    • 注意,数组是线性表中的顺序表,每两个元素之间的逻辑地址和物理地址都是连着的,并且地址是随着下标增加而增加

    • 所以就有可能出现图中的情况,arr[12]刚好覆盖掉变量 i

    • 至于为什么溢出数组空间了却没有报错是因为编译器忙着死循环了

3.2、对于大型的程序如何调试
  1. 使用断点加F5的方式,快速定位到,肯能出错的地方,然后再细致的分析

  2. 补充二维数组想要观察全部元素,需要采用数组名 加 逗号 加 总行号,如下图

五、编程常见错误归类

1、操作错误
  1. 拼写错误:这个真是害人,因为我们看字会自觉把不对的顺序看为我们熟悉的顺序,比如game和gmae,main和mian,这会导致我们排查不出来问题,遇到以下问题时,我们需要优先检查拼写是否正确

    • 未定义

    • 无法识别

  2. 链接错误

    • 没有包含头文件

    • 没有声明函数

3、运行错误:Stack overflow:表示栈溢出

http://www.jsqmd.com/news/611408/

相关文章:

  • OpenClaw技能扩展:用Qwen3.5-9B自动生成技术博客并发布
  • Windows任务栏透明化终极指南:TranslucentTB完整配置与故障排除
  • 2026年比较好的曹县厨房调料置物架/办公用品置物架/书房置物架/桌面置物架销售厂家推荐 - 品牌宣传支持者
  • OpenClaw技能市场探索:百川2-13B-4bits支持下的5个实用技能
  • SDMatte辅助UI设计:自动生成组件切图与多端适配素材
  • 嵌入式日志滚动覆盖技术及zlog实现
  • YOLO12车载部署:CAN总线信号融合的目标检测预警系统
  • HexaCast iOS App 技术支持网址(URL)
  • springboot学生公寓后勤宿舍报修后勤系统app小程序
  • 云容笔谈·东方红颜影像生成系统:剖析计算机组成原理与AI图像生成的底层关联
  • 2026年质量好的封盖膜源头/食品封盖膜实力工厂推荐 - 品牌宣传支持者
  • 2025-2026年加拿大移民中介评测:五家口碑服务推荐评价领先 - 品牌推荐
  • OpenClaw技能市场探秘:Qwen2.5-VL-7B专属图文处理模块大全
  • 忍者像素绘卷应用场景:微信小程序‘忍者技能树’像素图标动态生成
  • 2026年比较好的江阴热升华转印纸/江阴快干型转印纸生产厂家推荐 - 品牌宣传支持者
  • MedGemma-X开源大模型:适配国产医疗IT环境的轻量化影像认知引擎
  • Phi-4-mini-reasoning 3.8B Node.js环境配置与模型调用全指南
  • 从A*到Hybrid A*:FastPlanner如何解决无人机路径搜索的动力学约束问题
  • 2026年质量好的四川小型包装机/酱料包装机/小型包装机实力工厂推荐 - 品牌宣传支持者
  • #精准线索 存量挖掘:存量客户的深度价值挖掘
  • StructBERT模型互联网舆情监控实战:热点事件相似报道聚合
  • YOLO-v8.3镜像5分钟快速部署:告别手动配置,一键开启目标检测
  • 2026年质量好的天津重型二手货架/天津轻型二手货架/快递二手货架实力品牌厂家推荐 - 品牌宣传支持者
  • 像素剧本圣殿:零基础5分钟搭建你的AI剧本创作工作站
  • [特殊字符]️cv_resnet101_face-detection_cvpr22papermogface模型可解释性:Grad-CAM人脸热力图可视化
  • SUPER COLORIZER模型训练进阶:使用自定义数据集微调以适配特定画风
  • 2026年热门的沙漠除沙机/中国西部除沙机销售厂家推荐 - 品牌宣传支持者
  • OpenClaw权限精细化控制:Phi-3-vision-128k多模态能力按需授权方案
  • 2026年评价高的盐城恒温恒湿空调/盐城直膨式空调直销厂家推荐 - 品牌宣传支持者
  • 读2025世界前沿技术发展报告36新材料技术发展(上)