vs单步调试

调试程序,解决程序存在的BUG,是程序员必需要掌握的基本技能,如同医生给病人看病一样。


这里,我给大家简要介绍下如何在vs里面进行代码的调试。(Linux下的调试,有兴趣的同学可以百度(为什么是百度呢?只能百度了)GDB)


站在一个开发者角度,一个正常程序的生产必须经历:程序设计-->编码-->编译-->调试-->测试-->上线(发布)-->维护-->客服反馈问题-->调试解决BUG-->程序更新发布-->...


伪代码:

int main()

{

programe design;


while(coding != "success")

{

coding...;

}


while(compiling != "success")

{

if(error)

{

while(debug != "success")

{

coding...

}

}

}


while(test != "success")

{

if(error)

{

coding...;

debug...;

}

}


while(1)

{

release;

debug...;

coding...;

}


return 0;

}


从上面观之,调试贯穿于我们程序的整个开发过程中,甚至对于我们初学者,对于有些函数或语句我们不太清楚,不太理解的话,我们也可以边写代码边进行调试。


我们先主要讲解VS下如何调试的。

用我们实验课本上的例子(实验一,第8题,P38)


一:编码

【原则】

我们写的代码不仅要让机器高效的运行正常,更主要的是能让人看得懂(其他人看你的代码,能在短时间内知道你的代码在干啥,节省维护成本),所以一份好的代码,可易读性要比较好,如何做到可易读:

1、变量(或函数)名的命名。

一个较好的名字,就能让人明白你这个变量、函数是干嘛用的。如果全篇代码的变量都用a,b,c...,这种代码让人读起来就要“骂娘”的,而且即使是自己,隔了一段时间后,再来看代码,也许也不知道其含义或功能。


2、代码书写的格式。

一条语句,尽量占用一行,每个语句块(用大括号{}括起来的地方)都需要有缩进,大括号尽量都占一行。


3、适当的空行。

对于在同一个函数内,也可以按其功能进行代码的划分,适当的增加其空行。


一份好的代码,可以节省公司的很大的成本(后期维护人员的维护成本),上面只是基本简要的要求,对每个公司都会有自己的编码规范,有兴趣的同学百度 “谷歌代码规范” 进行学习。


二、编译

有些同学写完代码后,直接按VS的“调试”按钮运行程序,这样也行,但我们最好是先进行编译(点击运行按钮时也是先要编译的),如果有错误的话,我们再修改错误,如果没有错误的话,我们在运行。

如上图,写完代码后,先点击 Build --> Build Solution(我这是英文版的,中文版的应该是 生成-->生成XX)。

如果写代码有错误的话,会在左下角出现 Build failed(中文版应该是:生成失败),同时会在下面的窗口中把错误信息输出(如同),这时我们就要根据错误信息去修改错误(下面会说)。

如果写的代码正确的话,就会在左下角出现 Build Sucess(中文版是:生成成功)。

成功之后,就可以点击运行按钮,如下图:

【思考】:Start Debuging 与 Start Without Debugging 有什么区别?(中文版是 “开始运行” 与 “运行不调试)


另外,我们在调试程序时,都适用 Debug 模式,即如图:

看到很多同学使用 Release模式,在我们的调试阶段,使用这种模式不是非常的好的。


简要说下DeBug与Release的区别:

Release是在程序经过测试,并且确定无误后,发布(程序上线或交付)时使用的模式。在Release模式下,所有的代码都是经过编译器优化处理的,你写的源代码的执行过程,也许就不是程序最后执行的过程(比如一些运算,我们在写代码时,没考虑到效率,但在这种模式下,编译器就会优化)。假如我们在这种模式下调试代码,单步调试时,出现的结果也许就不是我们所设想的了。

而DeBug是没有经过优化的,在这种模式下运行的程序的逻辑,就是和我们的代码是一模一样的。

另外,Release生成的可执行文件是比DeBug生成的可执行文件少好几倍的。(同学们可以去比较下这两类文件的大小)。


修改错误:

上面的代码中,是有错误的,我们在编译的时候,左下角显示的是Build failed(如上图蓝色框),此时我们就要关注输出信息的错误,如上图紫色框:

1>f:\vs2008\project\实验一\实验一\8.cpp(10) : error C2065: 'y1' : undeclared identifier

这条信息,分为两部分:

(1)f:\vs2008\project\实验一\实验一\8.cpp(10) 出错的文件及行数:8.cpp这个文件的第10行。

(2)error C2065: 'y1' : undeclared identifier错误的原因。从这里我们可以看出,y1这个变量是未声明的。

注:错误信息是有编译器报出来的,只供我们参考。我们在找错误时,根据错误的信息,寻找到对应行的上下行,再进行修改。


根据上面的提示,我们双击1>f:\vs2008\project\实验一\实验一\8.cpp(10) : error C2065: 'y1' : undeclared identifier这一行,VS就会自动把我们的光标定位带源码的对应行,如:


找到这行后,我们仔细检查,发现确实没有y1这个变量,也许是我们手误把y写成了y1,此时我们只需要把y1写成y就可以了。

修改完后,在次编译,直到没有错误。




三、调试

一个程序能正常运行,但它的结果不是我们想象的结果,或者,我们拿到了别人前辈写的代码,我们要知道代码的运行流畅,这时,就需要使用到调试了。


1、设置断点。

同一个程序在进程的上下文(不明白,就忽略)是按照一定的顺序来执行的,如果我要使程序在某个地方停下来,此时断点就派上用场了。

把光标放在要使程序停下来的那行(如上图第7行),再把鼠标移到最左边,点击下就会出现一个红点,这个红点就是断点,当程序执行到这里时,程序就会中止。

取消断点:再点一次红点,断点就会取消。


2、启动程序。

断点设置好后,这时我们就可以启动程序,让程序跑起来

如同,点击如上按钮。(也可以:Build --> Start Debug)


3、单步调试

程序跑起来后,当运行到断点处,就会停止下来,如图:


(1)在工具栏里会出现图标:

从左到右:Continue(继续)、Break ALL(忽略)、Stop(停止调试)、Restart(重新调试)、Show Next Statement、Step Into(逐语句)、Step Over(逐过程)、Step Out(跳出)。

Step Into(逐语句):当有函数时,点击这个按钮,会进入这个函数内。

Step Over(逐过程):按语句单步执行。当有函数时,不会进入函数。

Step Out(跳出):如果有循环,点击该按钮,会执行到循环外面的语句。


(2)如果把鼠标移动到变量上面,会出现该变量当前的值。如:



(3)在下面窗口会出现所有变量名称和对应的值(如上图)


根据我的需要,选择Step Into或Step Over进行单步执行程序,直到解答我们设想的问题。


如上,自此,一个简单的单步调试流程就讲述完了。以后我们遇到复杂程序,想查看运行时的环境,就可以用这种方式。

又ps:Linux环境下的可以百度gdb。



ps:

这篇文章,我是现在“有道日记”里编辑好,本是想编辑好后复制过来的,但是发现图片复制不过来,所以,就又把文字复制来,然后上传图片,最后完成。但是发到手机预览时,发现格式有不正确了,哎,换用某个同学的话:心都累了。然后又来修改格式,发现还不是自己想要的结果。作为一个“变态”的处女座,也就内心隐忍着。


============华丽的分割线============

欢迎关注echo

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiongxianhe

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值