实用调试技巧(1)

简介: 实用调试技巧(1)

一、什么是bug?

第一次被发现的导致计算机错误的是飞蛾,也是第一个计算机程序错误。

bug的由来:

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

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

所以发生的事都是有迹可循,如果问心无愧,也就无需掩盖也就是没有迹象。如果问心有愧,那一定有迹象,迹象越多越容易顺通摸瓜,这就是推理的过程。

排查问题的时候,我们要做到:我们做什么?我们想做什么?我是怎么做的?做的过程中写了什么代码?


2.1 调试是什么?

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


2.2 调试的基本步骤

发现程序错误的存在

定位排查错误

确定错误产生的原因

提出纠正错误的解决方法

对程序错误进行改正,重新测试

2.3 Debug和Release的介绍

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

Release称为发布版本(没法调试),它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,方便用户很好地使用。

软件上线的过程:

代码在Debug环境下代码展示:

代码在Release环境下代码展示:

代码在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,我们要去总结,迎难而上。

一定要熟练掌握调试技巧;平常写代码,多去调试,敢于调试,去定位问题,才能有进步。这里我写的都是一些简单的调试方法,务必要掌握。


相关文章
|
安全 数据处理 开发工具
第三方SDK合规浅析
近日,工信部通报了22款APP、SDK存在侵害用户权益行为。通报超半数的原因违反了《个保法》最小化收集的原则,包括超范围收集个人信息,APP强制、频繁、过度索取权限。
425 1
‘you-get‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
‘you-get‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
610 0
|
JSON 数据格式
electron自定义最小化,最大化和关闭按钮
electron自定义最小化,最大化和关闭按钮
512 0
|
机器学习/深度学习 数据挖掘
R实战|从文献入手谈谈logistic回归、Cox回归以及Lasso分析(一)
R实战|从文献入手谈谈logistic回归、Cox回归以及Lasso分析(一)
1451 0
|
安全 Java UED
深度解析Java中方法内的异步调用实践与应对方案
深度解析Java中方法内的异步调用实践与应对方案
510 1
|
数据可视化 数据挖掘 UED
Plotly交互式数据可视化
【10月更文挑战第12天】本文介绍了如何使用 Plotly 实现交互式数据可视化,涵盖从安装 Plotly 到数据准备、图表创建、添加交互功能、导出图表及自定义图表样式的全过程。通过具体示例,展示了如何创建和优化交互式折线图,提升数据分析的效率和趣味性。
554 60
|
SQL 数据采集 数据可视化
深入 Python 数据分析:高级技术与实战应用
本文系统地介绍了Python在高级数据分析中的应用,涵盖数据读取、预处理、探索及可视化等关键环节,并详细展示了聚类分析、PCA、时间序列分析等高级技术。通过实际案例,帮助读者掌握解决复杂问题的方法,提升数据分析技能。使用pandas、matplotlib、seaborn及sklearn等库,提供了丰富的代码示例,便于实践操作。
339 64
|
Kubernetes Java 容器
k8s部署springboot项目yaml
k8s部署springboot项目yaml
412 0
|
Java 编译器 数据库
小唐开始学 Spring Boot——(4)代码生成器
小唐开始学 Spring Boot——(4)代码生成器
|
计算机视觉 索引
02 OpenCV图像通道处理
在数字图像处理中,图像通道是指一个图像中的颜色信息被分离为不同的颜色分量。常见的图像通道包括RGB通道、灰度通道、HSV通道等。 RGB通道是指将图像分离为红色、绿色和蓝色三个颜色通道,每个通道表示相应颜色的亮度。这种方式是最常见的方式,它对于彩色图像的处理非常重要。