实用调试技巧基础讲解

实用调试技巧

调试是什么?有多重要?

debug和release的介绍.

调试快捷键的使用。

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

  • 查看临时变量的值

  • 查看内存信息

  • 查看调用堆栈

  • 查看汇编信息

  • 查看寄存器信息

调试是什么?有多重要?

所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径,顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。

一名优秀的程序员是一名出色的侦探

我们作为初学者,一般是如何写代码的?

又是如何排查出现问题的呢?

请大家记住!拒绝迷信式调试!!!

调试是什么?

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

调试的基本步骤

  • 发现程序错误的存在

  • 以隔离、消除等方式对错误进行定位

  • 确定错误产生的原因

  • 提出纠正错误的解决方法

  • 对程序错误予以改正,重新测试

Debug和Release的介绍

Debug通常被成为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。

Release被称为发布版本,它往往是进行了各种优化,是的程序在代码大小和与逆行速度上都是最优的,以便用户很好使用。

调试快捷键的使用

最常使用的几个快捷键:

F5

启动调试,经常用来直接跳到下一个断点处。

F9

创建断点和取消断点

断点 的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,然而一步步执行下去。

F10

逐过程,通常用来处理一个过程,一个过程可以是依次函数调用,亦或是一条语句。

F11

逐语句,即每次都执行一条语句,但这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的。

CTRL+F5

开始执行不调试,如果你想让程序直接运行起来,而不进行调试。

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

1.查看临时变量的值

在调试开始之后,用于观察变量的值

那么如何打开这一功能呢?

在程序调试期间,找到最上面的工具栏中的调试,紧接着窗口,然后选择监视,就可以实现这一功能

2.查看内存信息

调试->窗口->内存 ,就可以查看当前内存信息了

3.查看调用堆栈

窗口 - > 调试-> 调用堆栈

还可以去查看汇编信息以及寄存器信息,这里就不给大家展示了,大家可以自行动手去调试。

在这里,想给大家展示一段代码,在vs编译器,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("I am a student.\n");
    }
    return 0;
}

想一想,这段代码的输出结果到底是什么呢?

答案是:死循环打印" I am a student."

为什么会死循环打印,而不是打印10个"I am a student."。

这是,我们就可以通过通过调试来查看到底哪里出了问题。

这张图片一个格子代表4个字节,就当于一个格子代表一个整型数据所占空间的大小,

可以看到arr[12]与变量i共用一个内存空间,也就意味着当代码执行到i=12的时候,执行arr[12]=0,也就意味着将i也变为0,因此会导致死循环。

通过调试我们得知,结果正如我们猜想的一致,i与arr[12]共用一块内存单元。

但是为什么会出现这种情况?原理是什么?

这个我们就不必担心,这个是由于编译器的问题,当我们将变量i的定义放在arr[10]的定义后面就不会出现这种问题。

const修饰指针变量的时候的作用

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

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

#include<stdio.h>
int main()
{
    int a=10;
    int b=100;
    
    const int *p=&a;
    *p=20;//error,const在*号左边,不能通过指针来改变指针所指向的内容
    p=&b;//ok,指针变量本身可以被修改
      
    int *const q=&a;
    *q=20;//ok,const在*号右边,可以通过指针来改变指针所指向的内容
    q=&b;//error,指针变量本身不可被修改
    
    const int* const m=&a;
    *q=40;//error
    q=&b;//error
    
    return 0;
}

今天就将这么多,如果你喜欢我的博客的话麻烦留下小爱心呦😜😜

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值