跟我一起学windows初高级调试之你为什么要学调试
本系列文章使用C/C++语言,vs自带调试器和windbg等其他相关调试工具,介绍windows下用户态下的初高级调试,不涉及内核调试。
关于我
我不是专家,只是一个热爱技术的程序猿。
写本系列博文主要有以下三个目的:
1.系统的学习相关调试技术。
2.记录学习历程。
3.交流调试技术。
4.帮助更多初学者。
适合人群:
1.使用C/C++语言编写过相关windows程序,希望学习相关调试技术的童鞋。
2.熟悉IDE自带调试器调试,但对windbg不熟悉,希望使用windbg提高工作效率的童鞋。
3.使用过windbg进行调试,但并未系统的学习过相关调试理论的童鞋。
也许很多人会问调试还分为初级和高级调试么?在此我将初级调试和高级调试作以下分类:
初级调试:使用IDE自带调试工具,如vc6.0或vs自带调试器,在开发过程中使用断点进行简单的单步跟踪、单步调试。
高级调试:使用windbg定位修复程序出现的各种复杂问题。如栈溢出,堆破坏、死锁、资源泄露等。
之所以这样区分并不是因为vs自带调试器不如windbg。而是因为二者有各自的适用范围 。
你为什么要学调试
有过一段时间编程经验的程序员都明白,程序不可能一遍写成。需要经过多次的修改、运行、再修改再运行...经过若干次的迭代之后才会交付或发布。而发布也并不意味着结束,因为在运行中也会发现各种bug,然后就是改bug->测试->引入新bug->再测试等等这一系列的迭代过程。对于工期紧张的软件项目,后期常常由于现有bug无法被修复,而导致延期交付,客户有意见,领导不满意,损害了公司的声誉。而拥有了软件调试的相关技术后,各种bug再也不在难以攻克了。
每每谈起调试,听到的更多的都是我使用vs自带的调试器已经足够,为什么还要学习什么windbg?
不得不承认vs自带调试器的可操作性要比windbg好的多。在代码编写阶段,vs是不二选择。相比之下windbg却拥有众多晦涩难懂的命令,界面也相对丑陋,可操作性差,而且使用前需要配置。但是对于事后调试(以后会介绍)和定位类似死锁、资源泄露、堆破坏等复杂问题,Windbg就大有用武之地。Windbg基于命令行,灵活且功能强大。尺有所短寸有所长,二者适用范围不一样。后面我们会遇到同时使用二者进行问题定位与分析的情况。
学习调试技术的好处:
1. 将多方面知识融会贯通。
软件调试涉及操作系统、cpu、编译原理等各个方面的知识,是计算机各个模块复杂交互的过程,学习调试不仅可以提高我们的调试技能,还能够加深对计算机系统的理解,将各个学科的知识融会贯通。
2. 应用到平时开发工作中去,提高软件的可调试性。
在软件开发过程中有目的的添加一些方便调试的代码,方便了以后的调试。提高了调试效率同时也方便以后的维护。
3. 快速熟悉陌生代码和系统底层。
运用调试手段观察、跟踪和理解代码的执行过程,加深对软件执行流程和系统底层的理解。
4. 提高工作效率。
很多软件项目的延期是跟无法定位与解决存在的bug有关。掌握了基本的调试方法和调试工具后,可以提高工作效率。原本需要很长时间才能定位、发现的问题,可以很快的解决。你当然不需要加班加点,软件项目也可按期交付,提高客户满意度和公司竞争力。
5. 提高个人核心竞争力,有利于个人长远发展。
由于软件调试技术广泛的关联性,增加了学习软件调试技术的难度,准入门槛高,同时该技术在短时间内难以发展和升级。软件调试技术具有很好的稳定性,一朝学会终生受用。
接触过很多优秀的程序员,发现他们都很看中软件调试。他们编写的软件在提交测试之前已经通过调试修复。对于测试发现的问题也能够及时的发现问题的所在。因此在公司拥有很好的口碑。
初步计划本系列文章分为初级篇、进阶篇和高级篇。
接下来的初级篇的几篇文章将包括以下几个方面的内容:
1.介绍vs自带调试器的使用,并进行简单调试。
2.初次接触windbg,简要介绍windbg使用。
3.使用windbg进行简单的调试。
初级篇和进阶篇均面向实用,一切以可以应用到实际使用为出发点。不注重讲解各种长篇大论的调试理论。随着认识的不断深入,高级篇将会对各种理论进行系统阐述。
学习软件调试是枯燥的,你必须一遍又一遍的去研读调试理论。同时也是快乐的,我们享受攻克一个有一个难关后的欣喜。 在这个浮躁的时代,我们总是抱怨工资太少,房子太小,车子不好。可是抱怨之后情况仍不会有所改观。改变现状最好的办法就是改变我们自己。静下心去好好钻研一些东西,提高自己的含金量。谁也不会亏待一个有真才实学的人。当然并不一定必须去钻研调试技术,任何其他技术也一样。
2014.2.9于浙江杭州