当程序遇上困难:程序调试的艺术(VS)


前言

程序调试,是每个程序员在开发过程中都会遇到的必经之路,今天将分享一些实用的调试技巧,来修炼我们内功,拥有好的内功可以让我们的编程更加得心应手哦·。


一、什么是bug?

Bug是指在程序或系统中存在的错误或缺陷。它可能导致程序无法按照预期的方式运行或产生意外的结果。Bug可以是由编程错误、逻辑错误、算法问题、外部环境变化等引起的。当程序员在开发过程中遇到bug时,他们需要通过调试来定位和修复这些问题,以确保程序的正确性和稳定性。

编程常见的错误


常见的错误分类:

编译型错误

直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

链接型错误

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名
不存在或者拼写错误。


运行时错误

也就是程序运行时逻辑上的错误。此类错误纠正最为麻烦。
借助调试,逐步定位问题。最难搞 

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

所有发生的事都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有
愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。顺着这条途径逆流而上,就是真相。所以每一个合格的程序员都是一名出色的侦探。

想必许多初学者在日常敲代码的过程中都会遇到程序可以运行但不是自己预期结果的情况,遇到这种情况怎么办呢?大多数人估计都是一行一行的去检查逻辑,然后去猜错误的位置,不容易准确定位到错误位置。那么学会调试,就可以很好的解决这个问题,帮助你更快的锁定错误位置。

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

调试的基本步骤

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

 Debug和Release

我们在日常使用编译器时,编译器顶部都会有这样的选项:

 它们有什么不同呢?

 它们在可执行的文件上也有所不同:

Release版本下执行产生的可执行文件:

 Debug版本下:

 我们会发现它们两个产生的可执行文件的大小有着不小的差距,Debug版本为调试版本,里边包含了所以的调试信息,而Release版本为发布版本,代码在系统上运行时会做一定的优化,所占内存也会更小。

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

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

 此外要特别注意,在Release版本下是无法进行程序调试的。

 这里不再对两个版本不同进行详细介绍。

 三、windows环境调试介绍

我们要想调试一个程序,必须要是处于Debug的版本下才可以进行调试。

学会使用快捷键进行调试

 

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

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

 调试查看临时变量的值

当然我们也可以通过调试来查看当先变量的值,可以先按F10或F11先让程序进入调试的状态下,然后在调试功能的里找到窗口,在窗口的选项里找到监视(只有在调试状态下打开窗口才有),就可以弹出监视栏。

 输入想要查看当前变量的名字就可以查看到此时变量的数值。

 查看调用堆栈

在窗口里找到调用堆栈选项。

 通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置。


 

 调试示例练习

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

 这段代码输入3我们期望的输出值是9,而实际输出是15,大家可以通过调试来寻找错误。

 示例答案

在程序运行过程中,每次i变化循环都需要将ret初始化为1,上述代码由于未将ret及时初始化为1,导致i=3时,ret的值为2,循环结束后ret的值变为12(2*1*2*3)。1+2+12的值就等于15了。


总结

本期先讲介绍都只是一些简单调试技巧,在后边我们会遇到更复杂的调试情况。使用快捷键可以提高我们的调试效率。

对于初学者来说可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。

在私下里要多多动手,尝试调试,才能有进步哦。好的本期内容到此结束,感谢阅读!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值