Visual Studio实用调试技巧---让你成为高端的程序员

这篇具有很好参考价值的文章主要介绍了Visual Studio实用调试技巧---让你成为高端的程序员。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 💓博客主页:江池俊的博客
  • 👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路 ✅数据结构探索
  • 💻代码仓库:江池俊的代码仓库
  • ​🎪 社区:GeekHub社区 ​
  • 🎉欢迎大家点赞👍评论📝收藏⭐
  • 🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞

一、 什么是bug?

在计算机编程领域,bug指的是程序中存在的错误或缺陷。当程序无法按照预期的方式运行,或者产生意料之外的结果时,通常会被认为是有bug。bug可以导致程序崩溃、产生错误的输出、不正确的行为或不一致性。bug可以是由代码错误、逻辑错误、算法问题、输入错误、外部环境因素等引起的。发现和修复bug是软件开发中的重要环节,通常需要进行调试和测试来定位和解决问题。
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。
注:参考链接


二、调试是什么?有多重要?

调试(英语:Debugging / Debug):又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

🍁 调试的基本步骤

  1. 发现程序错误的存在
  2. 以隔离、消除等方式对错误进行定位
  3. 确定错误产生的原因
  4. 提出纠正错误的解决办法
  5. 对程序错误予以改正,重新测试

三、Debug和Release版本的介绍。

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

代码:

#include <stdio.h>
int main()
{
 char *p = "hello world.";
 printf("%s\n", p);
 return 0;
}

上述代码在Debug环境的结果展示:
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言
上述代码在Release环境的结果展示:
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言
Debug和Release反汇编展示对比:
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言
所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。


四、Windows环境调试介绍

  • Debug为调试版本,一般在开发完成后发布工程前,调试代码都是在Debug模式下进行的。
  • Release版本是不能调试的,一般都是在Debug版本下调试的,Release版本一般编译器会进行大量的优化,删除无用的代码,指令的次序调整等,让其速度更快。

Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言
在环境中选择 debug 选项,才能使代码正常调试。

🍁常用快捷键

  • F5 --> 启动调试,经常用来直接跳到下一个断点处。一般不会单独使用,而是配合F9一起使用。
  • F9 --> 创建断点和取消断点。断点的重要作用:可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
  • F10 --> 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。(遇到函数直接执行完整个函数,不进入函数内部)
  • F11 --> 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最 常用的)
  • CTRL + F5 --> 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

想知道更多快捷键?点我


🍁调试的时候查看程序当前信息

1. 查看临时变量的值:在调试开始之后,用于观察变量的值。
监视窗口:
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言

2. 查看内存信息:在调试开始之后,用于观察内存信息。
内存窗口:
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言

3. 查看调用堆栈:通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置。
调用堆栈窗口:
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言

4. 查看汇编信息:在调试开始之后,有两种方式转到汇编:
(1)第一种方式:右击鼠标,选择【转到反汇编】:
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言

(2)第二种方式:调试窗口找到反汇编
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言

5. 查看寄存器信息:可以查看当前运行环境的寄存器的使用信息。
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言

多多动手,尝试调试,才能有进步。

一定要熟练掌握调试技巧, 初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写 程序,但是80%的时间在调试。


五、调试实例

🍁 实例1

实现代码:求 1!+2!+3! …+ n! ;不考虑溢出。
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言代码改正:

#include<stdio.h>
int main()
{
	int i = 0;
	int sum = 0;//保存最终结果
	int n = 0;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		int ret = 1;//保存n的阶乘
		int j = 0;
		for (j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}

🍁 实例2

Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言
注意:此代码非常依赖环境,在vs2022 debug版本x86环境下才是死循环的,而release版本下此代码会被优化,改变内存布局,不会死循环。
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言


六、如何写出好(易于调试)的代码

优秀代码的特点:

  1. 代码运行正常
  2. bug很少
  3. 效率高
  4. 可读性高
  5. 可维护性高
  6. 注释清晰
  7. 文档齐全

常见的coding技巧:

  1. 使用assert
  2. 尽量使用const
  3. 养成良好的编码风格
  4. 添加必要的注释
  5. 避免编码的陷阱。

🍁assert的使用

assert 函数是一种在代码中用于测试和调试的工具,它用于在运行时检查一个条件是否为真。如果条件为真,则 assert 什么也不做,程序继续执行。但如果条件为假,assert 会引发一个异常(通常是 AssertionError),中断程序的执行。
示例:

模拟实现库函数:strcpy

/*
库函数strcpy
1.描述
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
2.声明
下面是 strcpy() 函数的声明。
char *strcpy(char *dest, const char *src)
3.参数
dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。
4.返回值
该函数返回一个指向最终的目标字符串 dest 的指针。           */
char *my_strcpy(char * dst, const char * src)
{
        char * cp = dst;
        assert(dst && src);//断言,防止传进来的是空指针或野指针
        while( *cp++ = *src++ )
        { 
             ;
        }     /* Copy src over dst */
        return dst;
}

🍁空指针和野指针的危害

1.空指针(Null Pointer):

空指针是指不指向任何有效内存位置的指针,通常用空值(NULL)表示。空指针通常表示指针尚未初始化或不引用任何有效的内存。访问空指针通常会导致程序崩溃或未定义的行为。主要危害有:

  • 程序崩溃:访问空指针可能会导致程序直接崩溃,因为操作系统会捕获到这种无效的内存访问并终止程序。
  • 未定义行为:C语言标准规定对空指针的解引用是未定义行为,这意味着不同的编译器和平台可能会表现出不同的行为,包括奇怪的运行时行为和数据损坏。
  • 安全问题:攻击者可以利用空指针漏洞来执行恶意代码,从而造成系统的安全问题。

2.野指针(Dangling Pointer):
野指针是指在指针指向的内存位置被释放或无效后,仍然保持了该指针的值。在访问野指针时,可能会读取到无效的数据或者修改其他内存区域,导致未定义的行为。主要危害有:

  • 数据损坏: 野指针可能会导致数据损坏,因为程序可能会误用已经释放或者不再有效的内存位置。
  • 难以调试: 由于野指针可能导致未定义行为,程序可能会表现出奇怪的错误,这会使调试变得非常困难。

🍁const的作用

const修饰指针变量的时候:

1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。

#include <stdio.h>

int main() {
    int num = 5;
    const int* ptr = &num;  // const在*的左边,指针本身可以变,但是指向的内容不可变
    // *ptr = 10;  // 这里会产生编译错误,因为不能通过ptr修改num的值
    num = 10;  // 可以通过num直接修改值
    printf("num: %d\n", num);  // 输出:num: 10

    int another_num = 20;
    ptr = &another_num;  // 可以将ptr指向另一个整数

    return 0;
}

在上述示例中,ptr 是一个指向 const int 的指针,这意味着不能通过 ptr 来修改它指向的内容,但可以通过修改 num 的值来间接地修改指针所指向的内容。另外,可以改变 ptr 指向其他整数。

2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

#include <stdio.h>

int main() {
    int num = 5;
    int* const ptr = &num;  // const在*的右边,指针本身不可变,但是指向的内容可以改变
    *ptr = 10;  // 可以通过ptr修改num的值
    printf("num: %d\n", num);  // 输出:num: 10

    // 以下操作是不允许的,因为ptr已经被声明为const,不能指向其他内存
    //int another_num = 20;
    // ptr = &another_num;  // 编译错误

    return 0;
}

在上述示例中,ptr 是一个指向 num 的常量指针,这意味着不能通过 ptr 来改变它指向的位置,但可以通过 *ptr 来修改它指向的内容。


练习:

模拟实现一个strlen函数

#include <stdio.h>
int my_strlen(const char *str)
{
    int count = 0;
    assert(str != NULL);//断言,也可以写成 assert(str);
    while(*str)//判断字符串是否结束
   {
        count++;
        str++;
   }
    return count;
}
int main()
{
    const char* p = "abcdef";
    //测试
    int len = my_strlen(p);
    printf("len = %d\n", len);
    return 0;
}

七、编程常见的错误

  1. 编译型错误
  • 产生原因:编译型错误是在编译阶段发生的错误,通常是由于语法错误、类型错误、未定义的标识符等造成的。编译器无法正确解析代码,因此无法生成可执行文件。
  • 解决方法:仔细检查代码,确保语法正确、类型匹配,并确保使用的标识符在正确的作用域中定义。查看编译器的错误信息和警告,逐一修复问题。相对来说简单。
  1. 链接型错误
  • 产生原因:链接型错误发生在链接阶段,当编译器尝试将多个源文件组合成一个可执行文件时。常见的链接错误包括重复定义、未定义的符号等。
  • 解决方法:确保不同源文件中的函数和变量只有一次定义,避免重复定义。如果遇到未定义的符号错误,检查是否缺少某个库文件的链接,或者确保函数定义在正确的源文件中。一般是标识符名不存在或者拼写错误。
  1. 运行时错误
  • 产生原因:运行时错误发生在程序执行阶段,可能由于无效的内存访问、除以零、类型不匹配等引起。这些错误可能导致程序崩溃、产生未定义行为或者不正确的结果。
  • 解决方法:使用合理的错误处理机制来捕获和处理运行时错误。例如,对于可能导致除以零的情况,可以在执行之前进行条件检查。使用异常处理机制(例如C++ 中的 try-catch)来捕获异常情况并进行适当的处理。确保指针的正确初始化和检查,以避免空指针或野指针问题。要习惯借助调试,逐步定位问题。最难搞。

🔥今天的分享就到这里,如果觉得博主的文章还不错的话,请👍三连支持一下博主哦🤞
Visual Studio实用调试技巧---让你成为高端的程序员,visual studio,ide,学习,经验分享,开发语言文章来源地址https://www.toymoban.com/news/detail-634457.html

到了这里,关于Visual Studio实用调试技巧---让你成为高端的程序员的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C生万物 | 程序员必备实用调试技巧分享

    本文,我们就来讲讲如何去进行调试, 对于一名优秀的程序员来说,除了要熟练写业务逻辑外,还要学会如何去调试代码,这是至关重要的! 🔰 那我们该如何去调试哪些东西呢?使用什么去调试呢?如何调试呢? —— 让我们带着上面这些问题一起进入调试的学习📖 首先

    2024年02月17日
    浏览(44)
  • Python程序员Visual Studio Code指南5调试

    当运行程序时终端输出错误时,可以参考编辑器中的\\\"问题\\\"面板来解决遇到的问题。不过,并非所有错误都会导致错误。可能出现的情况是,程序执行成功,但输出结果与预期不同。出现这种情况时,下一步就是找出程序中的错误。这个过程被称为调试。 您可以尝试通过注释

    2024年04月12日
    浏览(54)
  • Visual Studio调试技巧合集

    (1)移动鼠标到需要关掉调试的文件,点击 右键属性–常规–从生成中排除–是–确定 ,即显示“-”号排除,运行它main文件则可以运行不报错。 (2)另外一种做法是将不需要运行的main文件注释掉(Ctrl+K,ctrl+C),再运行另外一个main文件则不会报错。

    2024年02月04日
    浏览(34)
  • 【五一创作】Visual Studio常用调试技巧的温习

    当你在编写C程序时,难免会遇到代码出现错误的情况。这时候就需要用调试工具来定位问题并解决它。以下是一些在Visual Studio中使用调试器时常用的技巧,权当作温故总结罢~ 1. 断点 断点是调试中最为基本但也最常用的技巧之一。通过在需要定位的代码行上打上断点,程序

    2024年02月04日
    浏览(45)
  • 【C++】Visual Studio调试C++代码的13个技巧

      目录 前言 正文 一、打断点 二、逐语句执行和跳出执行 三、逐过程执行 三、运行到光标处 四、多次执行代码 五、快速监视 六、监视窗口 八、内存查看 九、局部变量 十、调用堆栈 十一、assert的使用 十二、条件断点 十三、函数断点 本文使用的是Visual Studio 2022社区版,但

    2023年04月24日
    浏览(57)
  • 2023测试人必备60个实用测试工具推荐,让你成为测试大咖

    目录 引言 一、测试管理工具 二、接口测试工具 三、性能测试工具 四、C/S自动化工具 五、白盒测试工具 六、代码扫描工具 七、持续集成工具 八、网络测试工具 九、app自动化工具 十、web安全测试工具 绵薄之力 无论你是一名资深测试人员还是刚入行的新手,你都必须知道:

    2024年02月11日
    浏览(38)
  • 【Git】Git分支与标签掌握这些技巧让你成为合格的码农

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Git》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一起学习,

    2024年02月05日
    浏览(39)
  • C语言技巧 ----------调试----------程序员必备技能

      🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂    🎂      作者介绍:                              🎂🎂        🎂 🎉🎉🎉🎉🎉🎉🎉              🎂           🎂作者id:老秦包你会,         🎂 简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

    2024年02月13日
    浏览(50)
  • Python程序员Visual Studio Code指南1简介

    当您开始Python开发之旅的时候,您最有可能接触到的是Python的集成开发和学习环境(IDLE Integrated Development and Learning Environment)。IDLE的简洁性非常适合新手,但对于那些对Python语言比较熟悉并需要高效工作流程的人来说,IDLE还有很多不足之处。目前有一系列用于Python开发的代码

    2024年02月13日
    浏览(29)
  • VS实用调试技巧

    Bug一词的原意是虫子,而在电脑系统或程序中隐藏着的一些未被发现的 缺陷或问题 ,人们也叫它\\\"bug\\\"。这是为什么呢?这就要追溯到一个程序员与飞蛾的故事了。 Bug的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电

    2024年02月01日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包