微软中国技术中心在帮助国内硬件厂商开发驱动程序和获得 DESIGHED FOR WINDOWS徽标时,发现有些开发驱动程序的工程师没有利用windbg这个功能强大的调试工具,所以本期特别向读者介绍调试工具Windbg。
前言
绝大多数在Windows平台上研发软件的工程师都非常熟悉Microsoft Visual Studio, Visual Studio方便友好的界面,强大的调试功能大大提高了工程师的工作效率和产品质量。Visual Studio一般用于user-mode的程序开发,对于调试kernel-mode的驱动程序,微软提供了另一个功能强大的调试工具Windbg(windbg也可以用于调试user-mode的程序),开发人员可以从网上免费下载(http://www.microsoft.com/whdc/devtools/debugging/default.mspx),微软中国技术中心在帮助国内硬件厂商开发驱动程序和获得 DESIGHED FOR WINDOWS徽标时,发现有些开发驱动程序的工程师没有利用windbg这个功能强大的调试工具,所以本期特别向读者介绍调试工具Windbg。
简介
Windbg可用运行于基于X86, Intel Itanium, or AMD64 处理器的机器上,可以运行在所有基于NT的操作系统上,可以调试这些操作系统本身和运行于其上的应用程序,服务,驱动程序。这里所说的基于NT的操作系统包括:
-
Microsoft Windows NT® 4.0
-
Microsoft Windows® 2000
-
Microsoft Windows XP
-
Microsoft Windows Server™ 2003
-
Microsoft Windows codename "Longhorn"
Windbg源码级调试使用和Microsoft Visual Studio相同的Symbol格式,Windbg可以查看源代码,设置断点,查看变量,内存,堆栈。需要特别指出的是,Kernel-mode调试需要两台计算机,一台作为主机(host),另一台作为目标机(target)。Windbg还支持远程调试。
Kernel-mode debug Setup
Kernel-mode 调试需要两台计算机通过Null-modem(或者1394)线连接起来,目标机和主机可以运行不同的系统,对于某一种系统,既可以运行Free build,也可以运行Checked build。通常主机都是运行速度快的Free build 版本的系统,目标机可以根据调试的需要运行Free build 或 Checked build。
特别提醒一下,开始调试前,可以先用超级终端检查两机之间的物理连接能否正常工作。
目标机的配置工作主要是编辑boot.ini文件,指定和主机通讯的串口,波特率等,可以使用工具bootcfg.exe 或 msconfig.exe。如果手工编辑,通常需要先修改该文件的属性,编辑前最好先做个备份。
修改属性:attrib -s -h -r boot.ini
恢复属性:attrib +s +h +r boot.ini
典型的用于调试的boot.ini:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Debugging with Cable" /fastdetect /debug /debugport=COM1 /baudrate=115200
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
主机端的配置相对简单,只要在Windbg的File菜单中选Kernel debug,选择相应的串口和波特率就可以了。
Replacing driver files
在驱动程序开发调试过程中,需要频繁地替换系统中的驱动程序,由于Windows的保护机制,替换工作常常需要系统启动为安全模式,并多次重新启动。Windows XP或之后的操作系统提供了一种方便的替换方法。只要在主机上建一个文本文件描述需要替换的驱动程序就能实现,格式为:
map
\Systemroot\system32\drivers\videoprt.sys
\\myserver\myshare\new_drivers\videoprt.sys
如果该文本文件名为mymap.ini, 只要在windbg中指定该文件名就行:set _NT_KD_FILES=d:\Map_Files\mymap.ini
Symbol 文件
源文件被编译连接产生可执行代码.exe或.dll,编译器和连接器同时还生成.pdb文件,这就是所谓的Symbol文件,Symbol文件包含了实际执行代码不需要的信息,这些信息是用于开发人员调试的,一般包括:
-
全局变量
-
局部变量
-
函数名及其入口地址
-
FPO(frame pointer omission)数据(用于Stack trace)
-
源码行号
根据编译选项不同,可执行代码和Symbol文件所包含的信息量也不同。通常编译器会对代码进行优化,用于调试的信息会减少,为了方便开发人员调试,微软对基于NT的操作系统提供了两个版本:
-
Free Build(or retail build)
-
Checked Build(or debug build)
Checked build 含有更多的调试信息,可以通过订购MSDN获得。
调试时必须保证执行代码和Symbol文件的匹配,这对于开发一个小的程序或项目不是问题,但对于大型项目或调试时需要操作系统的调试信息时,版本匹配将是一个非常繁琐的问题,这个问题可以通过Symbol server解决。开发人员可以利用工具Symstore.exe来构建一个Symbol server。
对于操作系统模块的Symbol文件,微软提供了一个Public symbol store,只要你的调试主机能够连接到Internet,就可以指向该站点,Windbg会自动从该站点获取匹配的Symbol文件。
Debugger extensions
Windbg提供了丰富的扩展命令,这些命令是操作系统开发人员开发,用来调试操作系统的,驱动程序开发人员可以利用这些命令来获取和其开发的驱动程序相关的系统的信息。例如:
!analyze –v 当系统crash或发生异常时,通常用来分析出错的原因。
!peb, !teb 以易读的格式显示PEB and TEB的内容
!heap 解析heap的状态
!handle 获取handle的信息
!token Dump安全token
开发人员还可以开发自己的扩展命令,方便地分析自己的数据结构,对象,事件。
Remote debug
远程调试在许多场合非常有用,例如开发工程师不再出现错误的现场,或者开发工程师需要异地的其他技术人员帮助。这时现场的工程师只要建立好调试环境,复现错误,然后异地的技术人员的计算机只要能通过网络连接到现场的主机就能实现远程调试。
Dump 文件
并非所有错误都能在调试阶段测试和复现出来,当系统在真实环境下运行并发生错误,出现蓝屏时,操作系统能将现场保存起来,Windbg能在事后对保存的数据进行分析。
在“我的电脑-〉属性-〉启动和故障恢复”中,用户可以设置转储类型:
-
(无)
-
小内存转储
-
核心内存转储
-
完全内存转储
利用windbg对dump文件进行分析时,同样需要symbol文件。