NetRochtml
Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面若是没有指明,那么我会使用WinDbg来做为这一套调试工具的简称)。我第一次接触是在三年前的一个内核驱动项目,因为进行了IDT中键盘鼠标中断的Hook,使用Softice调试时形成会形成影响,只得使用WinDbg经过串口进行双机调试。自此以后这个Windows平台下最为强大的调试工具一直是开发过程当中的必备。这里我绝不掩饰的说"最强",可能不少经过逆向工做而接触调试的朋友不会认同,可是我相信随着对WinDbg了解的加深,以及对这套工具在软件开发中应用的了解,他们也会和我有同样的观点。安全
一直以来,软件调试技术在软件开发者中都没有获得足够的普及和重视,互联网上能找到的系统描述的资料也较少。随着国内软件行业总体的发展和进步,这些技术慢慢开始获得推广。2008年出版的有关调试的数据比以往都要多。我有幸拜读了Raymond的《软件调试》,以及熊力的《Windows用户态程序高效排错》,获益良多。 这几年的工做中也积累了一些关于Windows调试工具的知识,但愿可以将这些东西进行一些分享。所以,利用几个月空闲时间翻译了WinDbg文档中上半部调试器配置、使用和命令介绍的内容,同时准备写一些关于WinDbg调试工具的初级文章。但愿可以为对调试技术感兴趣而又苦于没有资料的朋友提供一些帮助。性能优化
特别感谢个人前同事小喂。虽然他第一条串口线仍是我焊的,可是他对于WinDbg的使用和了解程度很快就超过了我。在至关长时间的共事和讨论中,让我学到了不少。服务器
WinDbg是专门为Windows NT系列操做系统设计的调试器,最先是做为Windows NT 3.1的工具发布的。其后也一直跟随NT操做系统的发展而不断发展完善。若是用一句话来归纳,能够说WinDbg是为了软件开发而存在的调试工具。软件包中的调试器和小工具的各类功能都是为了配合软件的开发而设计的,而且覆盖到了Windows平台下各类不一样类型项目的调试(传统的SDK或MFC应用程序、.NET平台应用、COM应用、软硬件驱动程序等等)。网络
Windows调试工具包中的调试器包括WinDbg、KD、CDB和NTSD。其中, KD用于内核调试;CDB和NTSD用于用户态调试,在功能和使用上几乎彻底一致;WinDbg是内核调试器和用户态调试器的综合体,因为功能完善而且具备图形界面,因此是最经常使用的工具。它们可以在x8六、Itanium和x64机器上的全部NT平台操做系统中运行。工具
另外,工具包中还有一些小工具,下面是经常使用的几个:性能
另外,Application Verifier虽然没有包含在软件包中,可是也是一个很是强大的工具。能够对程序运行时的不少状态进行监控,以发现一些普通调试难以找到的错误。下面是Application Verifier配置界面的一个截图:优化
Application Verifier能够在这个页面下载:http://go.microsoft.com/fwlink/?linkid=108353操作系统
可能不少已经习惯使用SoftICE、OllyDbg、IDE调试器的朋友会提出这样的疑问:在这么多调试器中,为何要选择WinDbg?它究竟有什么特色?
设想一下下面几个场景:
在现实环境中,有不少复杂的调试场景,咱们须要专业级的调试器来解决这些问题。而WinDbg偏偏提供了这种商业软件环境下的专业级软件调试功能,它和其余不少咱们熟知的调试器的区别也在于此。
咱们将WinDbg和其余调试器分做内核调试器和用户态调试器两类来进行比较。
内核调试方面:
WinDbg |
SoftICE |
|
原理 |
Windows操做系统内置调试支持 |
Hook中断,接管系统 |
系统和平台支持 |
x8六、Itanium和x64机器上的全部NT平台操做系统 |
x86,因为已中止更新,新版本操做系统中支持不佳,老系统中也经常遇到兼容性问题 |
符号和源码支持 |
完美支持符号调试和源码调试,可直接使用微软公共符号 |
支持符号调试和源码调试,可是须要先转换符号格式 |
远程调试 |
经过和远程工具、转发器的配合,实现各类灵活的远程调试方式,以支持不一样的网络环境 |
经过Virtual SoftICE支持基于网络的远程调试 |
硬件需求 |
经过串口、139四、USB 2.0接口的双机调试;经过Pipe链接的虚拟机调试;或者功能有诸多限制的本地内核调试 |
单机或者经过Virtual SoftICE的双机调试 |
用户界面 |
因为是双机调试,调试器只是主控机上运行的一个普通软件。拥有GUI界面,能够同时进行其余应用。 |
单机调试时彻底接管系统,字符界面,操做不是很方便。 |
扩展性 |
支持脚本和插件,而且软件包自己提供了大量很是有用的插件 |
支持插件 |
因为SoftICE已经中止更新,WinDbg能够说是如今Windows平台上惟一好用的进行内核调试的工具,而且随着新版本的不断推出,不断地添加对新版操做系统的支持以及完善功能。强大的符号支持,方便的源码调试,使得内核级调试可以事半功倍。
用户态调试方面:
Windows调试工具包 |
OllyDbg |
Visual Studio调试器 |
|
原理 |
Windows的用户程序调试支持 |
Windows的用户程序调试支持 |
Windows的用户程序调试支持 |
系统和平台支持 |
主要基于NT系统,9x内核下支持不佳而且须要安装附加模块 |
主要支持NT系统,9x下也可使用 |
新版本的VisualStudio不支持在9x系统下安装。VC6以前能够在9x下调试 |
符号和源码支持 |
完美支持符号调试和源码调试,可直接使用微软公共符号 |
支持符号调试和源码调试 |
支持。VS2008开始能够直接使用微软公共符号 |
远程调试 |
经过和远程工具、转发器的配合,实现各类灵活的远程调试方式,以支持不一样的网络环境 |
不支持 |
较新版本Visual Studio中支持 |
无源码调试 |
反汇编分析能力较弱,GUI界面偏弱,无源码时调试比较困难 |
强大的代码分析能力,无符号和源码时也能很好的进行调试 |
无源码调试的支持很弱,使用不便 |
用户界面 |
GUI界面不是很丰富,大量操做须要经过命令 |
GUI界面强大,可以实现大多数调试操做 |
介于WinDbg和OllyDbg之间。 |
扩展性 |
支持脚本和插件,而且软件包自己提供了大量很是有用的插件 |
支持脚本和插件,有大量可用的资源 |
支持插件扩展 |
Dump文件调试 |
支持,分析功能强大 |
不支持 |
支持,可是不够强大 |
.NET调试 |
经过SOS.dll支持,进行高级调试比较方便 |
不能直接支持 |
功能强大易用,绝大多数状况下都能解决问题 |
因为WinDbg功能至关复杂,有不少方面并不能一一比较,例如非侵入式调试、经过WinDbg控制CDB和NTSD来调试系统服务、建立和分析Dump文件等等。
整体来讲,WinDbg更适合做为软件项目开发和维护过程当中的调试工具使用,而OllyDbg更适合逆向工程。
根据我我的对WinDbg的使用经验来讲,它更适合做为开发维护的辅助工具来使用。
若是要进行用户态的逆向工程,推荐使用OllyDbg、IDA这些拥有强大汇编程序分析能力的工具。
WinDbg更适用于如下这些场合:
windbg中文文档:http://www.dbgtech.net/windbghelp/index.html
from:http://www.cnitblog.com/cc682/archive/2008/11/27/51945.aspx