Windows调试工具入门—1

NetRochtml

http://www.DbgTech.net编程

  1. 引子

Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面若是没有指明,那么我会使用WinDbg来做为这一套调试工具的简称)。我第一次接触是在三年前的一个内核驱动项目,因为进行了IDT中键盘鼠标中断的Hook,使用Softice调试时形成会形成影响,只得使用WinDbg经过串口进行双机调试。自此以后这个Windows平台下最为强大的调试工具一直是开发过程当中的必备。这里我绝不掩饰的说"最强",可能不少经过逆向工做而接触调试的朋友不会认同,可是我相信随着对WinDbg了解的加深,以及对这套工具在软件开发中应用的了解,他们也会和我有同样的观点。安全

一直以来,软件调试技术在软件开发者中都没有获得足够的普及和重视,互联网上能找到的系统描述的资料也较少。随着国内软件行业总体的发展和进步,这些技术慢慢开始获得推广。2008年出版的有关调试的数据比以往都要多。我有幸拜读了Raymond的《软件调试》,以及熊力的《Windows用户态程序高效排错》,获益良多。 这几年的工做中也积累了一些关于Windows调试工具的知识,但愿可以将这些东西进行一些分享。所以,利用几个月空闲时间翻译了WinDbg文档中上半部调试器配置、使用和命令介绍的内容,同时准备写一些关于WinDbg调试工具的初级文章。但愿可以为对调试技术感兴趣而又苦于没有资料的朋友提供一些帮助。性能优化

特别感谢个人前同事小喂。虽然他第一条串口线仍是我焊的,可是他对于WinDbg的使用和了解程度很快就超过了我。在至关长时间的共事和讨论中,让我学到了不少。服务器

  1. Windows调试工具的简介和组成

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平台操做系统中运行。工具

另外,工具包中还有一些小工具,下面是经常使用的几个:性能

  • KDbgCtrl:用于控制和配置内核调试的一些参数。例如是否只有当发生异常时才会启用内核调试、设置DbgPrint缓冲区大小、如何处理用户模式异常等等。
  • ADPlus:这是一个VB脚本,能够为一个或多个进程自动建立内存dump。
  • SymStore:用于建立符号存储。当须要建立本身的符号存储时就要用到它了。
  • SymProxy:用于在网络中建立单独的HTTP符号服务器,以供全部调试器使用。该工具特别适合企业级应用的环境,能够将多个符号存储经过单一的接入点提供使用。
  • DbgSrv、KdSrv、Remote.exe:用于远程调试。
  • GFlags:用于编辑Global Flags。
  • UMDH:用于对用户模式堆分配的状况进行转储和分析。
  • USBView:这是WinDbg 6.10.3版本才加入到软件包中的工具,能够查看当前链接到系统中的USB设备信息。

另外,Application Verifier虽然没有包含在软件包中,可是也是一个很是强大的工具。能够对程序运行时的不少状态进行监控,以发现一些普通调试难以找到的错误。下面是Application Verifier配置界面的一个截图:优化

Application Verifier能够在这个页面下载:http://go.microsoft.com/fwlink/?linkid=108353操作系统

  1. Windows调试器和其余熟知的调试器比较

可能不少已经习惯使用SoftICE、OllyDbg、IDE调试器的朋友会提出这样的疑问:在这么多调试器中,为何要选择WinDbg?它究竟有什么特色?

设想一下下面几个场景:

  • 公司的软件针对企业级用户,该客户在地球另外一半的美国。有一天客户抱怨了一个BUG,可是从抓取的dump又没办法看出个因此然,想进行动态调试查找缘由。公司预算有限,不能让你过去出差顺便旅游、对方公司有防火墙,不容许外部链接,等等等等。。。怎么办?
  • 项目规模很大,涉及到的模块多,版本也多,而且是由不一样部门开发的。这些部门可能遍及五湖四海。如何在调试其中某个模块时,可以快速得到它的符号和源文件,而不用每次都从一大堆不一样版本的文件中辛苦找寻?调试到某个阶段,忽然发现这不是本身的模块出现问题,如何快速知道这个问题应该找谁解决?项目某些重要模块有保密须要,如何控制调试人员访问符号和源文件的权限?
  • 驱动程序怎么才能源码调试?SoftICE不支持新系统,我要在Vista上调试怎么办?
  • 软件中包含一个Windows服务组件,可是每次尚未登录到桌面以前就崩溃了,怎么进行动态调试?
  • 我想调试Explorer,调试IE,调试CSRSS,调试……,可是调试器一附加上去,系统就会出问题。怎么办?
  • 公司发布的软件,有用户反馈和XXX安全软件冲突总是形成系统崩溃,可是搭建环境以后却又没有办法重现;对方是个普通用户,鼠标都抓得不太稳。用户很火大,闹着要抓个老虎到公司来找你上司作俯卧撑,后果很严重,怎么办?

在现实环境中,有不少复杂的调试场景,咱们须要专业级的调试器来解决这些问题。而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更适合逆向工程。

  1. 什么时候使用Windows调试工具

 

根据我我的对WinDbg的使用经验来讲,它更适合做为开发维护的辅助工具来使用。

若是要进行用户态的逆向工程,推荐使用OllyDbg、IDA这些拥有强大汇编程序分析能力的工具。

WinDbg更适用于如下这些场合:

  • 商业软件的Debug和客户支持

 

  • 内核驱动的调试,以及对驱动进行逆向工程时进行动态调试
  • 研究Windows自己的内核或者软件
  • 疑难BUG的调试,如死锁、COM调用、资源泄露、堆栈或者堆溢出
  • 以性能优化为目的的调试
  • 对调试目标基本不形成影响的非侵入式调试

 

windbg中文文档:http://www.dbgtech.net/windbghelp/index.html

from:http://www.cnitblog.com/cc682/archive/2008/11/27/51945.aspx

相关文章
相关标签/搜索