调试器,顾名思义,就是用于调试的工具。为什么要调试呢?这得从一条虫子(bug)说起。江湖中传说还是在第一代真空管电子计算机时代,有一次研究人员发现计算机的行为不正常。于是他们就开始检查每个环节想找到原因,最终他们在机器里找到了条虫子(bug)从而解决了问题。于是后来便把发现并解决程序中与预期不符的行为称之为捉虫或除虫,也就bug加个De-前缀,即Debug。
火星人开发的程序是不是绝对没有bug,我不清楚,因为没见过。但是地球人的话,我个人认为鉴于自身思维上的不完备性注定了地球人开发的稍具规模的程序要完全正确几乎不可能。那么既然程序出现了bug,就要除掉它。修正的方法很多,比如检视代码、察看日志、借助调试工具等等。这里重点要介绍的就是Windows系统中使用的较多的一些调试工具,它们各有特点,也各有用途。更多地了解它们,就能更好的利用它们高效的查错。
u Visual Studio系列集成开发环境提供的调试器:Visual Studio系列作为微软提供的专业开发工具,配合其集成的可视化调试器,强大的能力那是可圈可点。尤其是VC++6.0(Visual Studio 98带的,因为重点是c++程序的调试,所以干脆就直接提VC6好了)之后提供的Edit and Continue功能,太爽了,太爽了!从此开发人员简直就变成了猫头鹰,如虎添翼哈~。VC6最大的特点就是开发功能和调试功能完美结合,察看内存、调用堆栈、寄存器,调试动态库,调试多线程,甚至直接进行汇编级的调试,功能可谓是琳琅满目,应有尽有。一定要好好掌握,这是基础。
u ntsd.exe:这是Windows系统自带的一个小巧的用户态调试器。到底是从Windows的哪个版本开始有的,我不清楚。但是Win2k之后的系统都有了。ntsd是NT Symbolic Debugger的简写。既然名字中都有Symbolic,那自然是表示带有符号调试的功能,这一点很有用,以后会提到。ntsd因为是系统自带的调试器,所以用来在程序发布后出现问题时收集信息时非常方便。只需要一个命令(先睹为快:ntsd -pv -pn app.exe -c ".dump /ma app.dmp;-q")就能把进程的信息dump下来分析,相当实用。
u 强大的Windbg:这是ntsd的增强版,更确切的说,ntsd是WindDbg的精简版。它提供了极为强大的调试功能,支持用户态和内核态源码级的调试,图形化的界面,使用起来还是挺方便的。关键是它可以很轻松的调试一些平常不容易解决的问题,比如死锁,CPU占用率100%,内存对破坏,堆栈破坏,程序崩溃等错误。如果你遇到这种棘手问题无法解决,那还等什么呢,赶紧祭出WinDbg吧。当然,强大的调试器命令自然也比较多一点,必须承认学好它还是有点费时的。但是,想一想学好它后可以解决的问题,相信我,绝对值回票价。WinDbg可以在微软官方网站下载,免费噢~
u OllyDbg:这是一款提供可视化界面的Win32汇编级的调试器。尽管你可以用它调试任何Win32用户态的程序,但是它的主要用户都是在破解界和病毒木马界。因为它最大的特点是能够自动的识别出大量的系统函数及函数参数、句柄对象、甚至直接修改二进制代码,所以如果想要分析竞争对手的特色功能的话,嗯嗯。。。。学习OllyDbg的使用,可以去一些专业的破解技术的网站(或者说安全技术的网站),比如国内最专业的网站:看雪,www.pediy.com
u Softice:尽管我已经多年没有再用过它了,但可以肯定的是,这绝对是我用过的最强大的调试器,以至于我都不打算在这里介绍它。对于每个想深入研究Windows操作系统的人,都应该学会使用它。google上有大量的相关信息。