一、前言
对于程序员来说,想要写出一个大型、完整、可靠的程序,乃至提升自己的编程能力,调试是一个必不可少的技能,它的目的在于即使发现并解决程序中出现的异常错误。
程序错误一般有两种:
- 语法错误
- 逻辑错误
语法错误很简单,就是你没有按照某种语言的规则去写代码,编译器无法正常识别、编译你的代码。
这种错误的修复比较简单,因为编译器一般都会直接给你指示出来。
有时候可能也并不简单,比如C++中的STL模板……,只要你填错一个参数,编译器就会给你报出几大屏幕的错误,让你难以识别,这种情况下,很多时候就只能凭借经验去修复。
比如vs中,如果我调用了一个不存在的函数,那么编译器就会直接报错:
这种修复起来大多数还是比较简单的,同时也用不着、也无法进行“调试”。
调试的主要作用是识别、修正程序的逻辑错误,使用它的前提是,你的代码已经能够跑起来了。
比如一个经典的错误:
从程序语法上来讲,这段代码并没有任何的错误,但只要你上过小学都知道,除数是不能为0
的。
由于语法没有问题,所以这段代码能够通过编译器的检查,并将其编译,但由于逻辑存在问题,你只要运行它,就肯定会报错:
如果你和我一样,都习惯于使用vs,那么上面这种报错信息我相信你时常能看到。
这种逻辑错误,很多时候也被称为“异常”,也就是上图信息中提到的,并且后面还会附带一段信息描述:Integer division by zero
,意思就是整数被0除,触发了这个异常。
这种简单的逻辑错误,一般编译器也同样能够为你精确指出来!
但对于稍微大一点的项目,编译器指出的错误可能与你所见的并不完全一致。
因为它一般显示的是比较底层、浅显的错误,而由于我们很多时候用的都是第三方库,又或者代码量很大,你很难去一行一行追查、查看看。
而这个时候一般就需要用到调试了。
二、断点
目前主流语言中,尤其是那些由大公司出品、用户量较多的语言,一般都会有一个叫做“断点”的调试功能。
比如C++、python、java、C#等等等等,这是比较主流的调试方式。