实用调试技巧(1)

一、什么是bug?

第一次被发现的导致计算机错误的是飞蛾,也是第一个计算机程序错误
bug的由来:
bug(原意是臭虫或者虫子),第一代计算机是由许多庞大的真空管组成,并利用大量的电力来使真空管发光。引得一只小虫子Bug钻进了一支真空管内,导致整个计算机无法工作。研究人员费了半天时间,总算发现原因所在,把这只小虫子从真空管中取出后,计算机又恢复正常。后来,Bug这个名词就沿用下来。

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

所以发生的事都是有迹可循,如果问心无愧,也就无需掩盖也就是没有迹象。如果问心有愧,那一定有迹象,迹象越多越容易顺通摸瓜,这就是推理的过程
排查问题的时候,我们要做到:我们做什么?我们想做什么?我是怎么做的?做的过程中写了什么代码?

2.1 调试是什么?

调试(英语:Debugging/Debug):又称除错,发现一个程序错误的过程。

2.2 调试的基本步骤

  • 发现程序错误的存在
  • 定位排查错误
  • 确定错误产生的原因
  • 提出纠正错误的解决方法
  • 对程序错误进行改正,重新测试

2.3 Debug和Release的介绍

Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release称为发布版本(没法调试),它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,方便用户很好地使用。
软件上线的过程:
在这里插入图片描述
代码在Debug环境下代码展示:
在这里插入图片描述

代码在Release环境下代码展示:
在这里插入图片描述

Debug和Release反汇编展示对比:
在这里插入图片描述
在这里插入图片描述
Debug和Release比较,可以看出Release比Debug的程序代码小,代码也得到了优化, 但是我们不知道是怎么优化的。
下面我们继续看一个例子,探究一下:

#include <stdio.h>
int main()
{
    
    
    int arr[10] = {
    
     0 },i;
    for (i = 0; i <= 12; i++)
    {
    
    
        arr[i] = 0;
        printf("hehe\n");
    }
    return 0;
}

在Debug版本下执行程序,直接崩溃在这里插入图片描述

在Release版本下执行程序,执行成功
在这里插入图片描述
变量在内存中开辟的顺序发生了改变,影响到了程序执行的结果。
结论:这就是优化导致的,

三、windows环境调试介绍

3.1 调试环境准备

在环境中选择debug选项,才能使代码正常调试:
在这里插入图片描述

3.2 快捷键

最常用的几个快捷键:
F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点。
断点的作用:可以在程序的任意位置设置断点,这样就可以使程序在想要的位置上任意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部;更加细致,可以进入函数观察函数执行的过程。(这是最常用的)
CTRL+F5
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
注意:
如果说在你的电脑上f9、f10、f11不起作用,那是fn这个键的问题,关掉fn就可以了。(或者fn+f5;fn+f9;fn+f10;fn+f11)
展示:
在这里插入图片描述
扩展:

  • Ctrl+Tab 切换页面
  • Ctrl+D 粘贴光标所在行代码
  • Ctrl+/ 行注释掉/取消行注释
  • Ctrl+Shift+/ 块注释/取消块注释
  • Tab 向右缩进(两格)
  • Shift+Tab 回退一个制表符
  • Ctrl+Enter 当前行之前开辟一行
  • Ctrl+Z 撤销
  • Ctrl+Y 反撤销
  • Ctrl+A 全选
  • Ctrl+C 复制
  • Ctrl+V 粘帖
  • Ctrl+S 保存
  • Ctrl+F 快速查找
  • Ctrl+Shift+F 在文件中查找
  • Ctrl+H 快速替换
  • Home 回到行首
  • End 跳到行尾
  • Shift+Left/Right 向左/向右选中字符
  • Ctrl+Left/Right 以一个单词为粒度向左/向右移动光标
  • F4 显示属性窗口
  • F12 转到定义
  • Shift+Tab 取消制表符
  • F5 运行调试
  • Ctrl +F5 运行不调试
  • Shift+F5 结束调试
  • Ctrl+K+C 注释选中内容
  • Ctrl+K+U 取消注释内容
  • Ctrl+W+X 打开工具箱
  • Ctrl+E+W 自动换行
  • Ctrl+M+M 隐藏或展开当前嵌套的折叠状态
  • Ctrl+L 删除一行内容
  • Ctrl+E+D 排版整个文档格式
  • F11 逐语句调试
  • F10 逐过程调试
  • F9 启用/停止断点
  • Ctrl+Shift+F9 删除全部断点
  • Ctrl+E+S 查看空白
  • Ctrl+Alt+L 打开解决方案资源管理器。
  • F1 显示MSDN帮助。
  • Shift+Alt+F10 导入命名空间
  • Ctrl+F4 关闭当前标签窗口
  • Ctrl+Shift+空格键 查看参数信息
  • Shift+Alt+C 添加类
  • 光标快速切换到下一行:Ctrl + Shift + Enter
  • 光标快速切换到上一行:Ctrl + Enter

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

3.3.1 查看临时变量的值

在调试开始之后,用于观察变量的值也可以观察地址。
在这里插入图片描述

3.3.2查看内存信息

在调试开始之后,用于观察内存信息
在这里插入图片描述

3.3.3 查看调用堆栈

在调试开始之后
在这里插入图片描述
通过调用堆栈,可以清晰的反映函数的调用关系以及当前调用所处的位置。

3.3.4查看汇编信息(反汇编)

在调试开始之后
方法一:右击鼠标,选择转到反汇编
在这里插入图片描述
方法二:
在这里插入图片描述
然后就可以切换到汇编代码
3.3.5 查看寄存器信息
在这里插入图片描述
可以查看当前运行环境的寄存器的使用信息

四、结论

在我们编写程序的过程中,会遇到很多bug,我们要去总结,迎难而上。
一定要熟练掌握调试技巧;平常写代码,多去调试,敢于调试,去定位问题,才能有进步。这里我写的都是一些简单的调试方法,务必要掌握。

猜你喜欢

转载自blog.csdn.net/plj521/article/details/131472451