每个程序员必备的调试技巧,你真的学会了吗?

每个程序员必备的调试技巧,你真的学会了吗?

1.背景介绍1.1:为何要用到调试技巧?目的——程序员在写代码运行时难免会遇到些bug,而调试可以帮助我们发现问题所在,也可以帮助程序员理解项目运行时的逻辑,因此拥有卓越的调试技巧能力是每一个程序员必备的模块。

1.2:什么是bug?bug本意是“昆虫”或“虫子”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的

缺陷或问题,简称程序漏洞。

“Bug”的创始⼈格蕾丝·赫柏(GraceMurrayHopper),她是⼀位为美国海军工作的电脑专家。

1947年9⽉9⽇,格蕾丝·赫柏对HarvardMarkII设置好17000个继电器进⾏编程后,技术⼈员

正在进行整机运⾏时,它突然停止了工作。于是他们爬上去找原因,发现这台巨⼤的计算机

内部⼀组继电器的触点之间有⼀只飞蛾,这显然是由于⻜蛾受光和热的吸引,飞到了触点上,

然后被⾼电压击死。所以在报告中,赫柏⽤胶条贴上⻜蛾,并把“bug”来表⽰“⼀个在电脑程序

里的错误”,“Bug”这个说法⼀直沿⽤到今天。

历史上的第一个bug(来自网络)

2.调试介绍 2.1:什么是调试?明白bug是什么后,就需要找到问题并且修复问题,

这个找问题的过程叫称为调试,英⽂叫debug(消灭bug)

2.2:Debug和Release

在vs编译器中有Debug和Release

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

(程序员写代码时,久设置为debug,方便经常性的调试代码)。

Release 称为发布版本,往往进⾏了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户更好使用。当程序员写完代码,测试再对程序进⾏测试,直到程序的质量符合交付给⽤⼾使⽤的标准,用户使用的便是release版本的可执行程序。

题问:那么测试工程师测试的版本是Debug还是Release呢?

很明显,程序是交给客户使用的,因此测试的版本是Release。

3.调试技巧调试最常使用的几个快捷键:F9:创建断点和取消断点

断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执行,接下来我们就可以使用F10,F11这些快捷键,观察代码的执⾏细节。

条件断点:满⾜这个条件,才触发断点

打上断点后程序就在断点处开始进行

断点的更多用途

F5:启动调试,经常用来直接跳到下⼀个断点处,⼀般是和F9配合使用。

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

F11:逐语句,就是每次都执行一条语句语句,但是这个快捷键可以使我们的执行逻辑进⼊函数内部。在函数调用的地方,想进⼊函数观察细节,必须使用F11,如果使⽤F10,直接完成函数调⽤。

vs更多快捷键之后我也会一 一介绍

F10和F11的区别F11比更F10检索的更加细致

如:F11可以进入调用函数内部逐步检索,而F10会跳过调用函数内部过程,直接给出结果。

F11的调试

CTRL+F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

4.监视4.1如何进行监视?

首先需要先进入调试模式

4.2:内存4.3:为何要使用监视呢为了更好的理解程序运行的每一步,以及程序在哪一块出现了错误

举例:在vs2022 Debug x86的环境下的bug

代码语言:javascript代码运行次数:0运行复制#include

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;

}

我们所写的代码理应打印13次hehe,但运行窗口是无数次打印hehe,这是为啥呢?

当我们监视内存时会发现在这个环境下i和arr[12]存放的地址一样,从而导致死循环打印hehe

知识引入:栈区和堆区

当然,实际开发的过程中可能会遇到这个代码和环境,

取决于环境i和arr之间到底空出多少空间,这个是取决于编译器的。

相关

安卓手机如何设置默认相机应用?
亚洲28365

安卓手机如何设置默认相机应用?

📅 09-02 👁️ 617
魔兽世界怀旧服月光林地前往与离开的详细攻略
365投注入口

魔兽世界怀旧服月光林地前往与离开的详细攻略

📅 06-28 👁️ 3290
dnf千体药是什么
亚洲28365

dnf千体药是什么

📅 08-27 👁️ 1722