当您调试设备驱动程序时,从驱动程序和相关的子系统接收详细的调试跟踪信息很重要。
Microsoft 提供的多数驱动程序和子系统都使用全局变量和预定义的数值集,来控制发送给调试器的调试跟踪信息的详细程度。
本文讨论以下主题:
- 如何使用内核调试器和注册表值来启用和控制调试跟踪级别。
- 对于特定类别的驱动程序,可以使用相应的调试器扩展来启用和控制调试跟踪。
- 在 Windows 2000 和 Windows XP 中启用调试跟踪的区别。
重要说明:本文包含有关运行 .chk 文件以进行开发和测试的信息。Microsoft 产品支持服务 (PSS) 不支持安装有 .chk 文件的生产系统,但 PSS 为隔离问题而通知您安装的 .chk 文件除外。在生产系统上安装 .chk 文件之前,请确保您知道如何在出现问题时还原所替换的文件。
有关 .chk 文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
103659?
(http://support.microsoft.com/kb/103659/
)
在检查硬件时设置挂起;如何使用 Ntdetect.com
320040?
(http://support.microsoft.com/kb/320040/
)
如何使用 Ntdetect.chk 识别 Windows 2000 中的硬件问题
有关如何备份和还原系统的信息,请查看 Windows 2000 帮助和支持。
有关 NTbackup 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
240363?
(http://support.microsoft.com/kb/240363/
)
如何在 Windows 2000 中使用备份程序备份和还原系统状态
您还可以与您的备份产品提供商联系,以获取有关如何使用其产品的信息。
注意:以下调试信息会随时更改,并且只用于驱动程序调试目的。另请注意,调试信息对于任何非开发人员可能不是特别有用。
视频微型端口调试
请注意以下有关视频微型端口调试的信息:
1394 调试
请注意以下有关 1394 调试的信息:
USB 调试
请注意以下有关通用串行总线 (USB) 调试的信息:
PCI 调试
请注意以下有关外围设备组件互连 (PCI) 调试的信息:
- 它需要可调试的内部版本系统或可调试的内部版本 PCI.SYS 模块。
- 在基于 Windows 2000 和 Windows XP 的系统上,通过调试器来设置相应的全局变量。例如(0x3 表示最详细的级别):
ed PCI!PciDebug 0x3
收起该表格展开该表格
| 模块名称 | 调试符号 | 范围 |
|---|
| PCI.SYS | PciDebug | ?0-3? |
PCMCIA 调试
请注意以下有关 PCMCIA 调试的信息:
NDIS 调试
请注意以下有关网络驱动程序接口规范 (NDIS) 调试的信息:
- NDIS 调试需要可调试的内部版本 NDIS。有关如何在 Windows 2000 和更高版本上启用 NDIS 调试跟踪的其他信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
存储驱动程序调试
请注意以下有关存储驱动程序调试的信息:
- 它需要可调试的内部版本系统或可调试的内部版本存储模块。
有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
296225?
(http://support.microsoft.com/kb/296225/
)
如何启用 SCSIPORT 调试日志
打印机驱动程序调试
请注意以下有关打印机驱动程序调试的信息。
用户模式
- 需要可调试的内部版本系统或可调试的内部版本打印机驱动程序组件(unidrv 或 pscript)。
- 附加到打印应用程序或后台打印程序进程 (spoolsv.exe),具体取决于调试的是用户界面 (UI) 模块还是呈现模块。
- 对于 Unidrv 调试,请使用以下设置:
ed unidrv!giDebugLevel 1
内核模式
- 运行“gflags”命令,然后对 spoolsv.exe 启用以下标志:
- Windows 2000:“在页尾放置堆栈分配”
- Windows XP:“启用页堆栈”
- 重新启动后台打印程序(网络停止/启动后台打印程序)。
- 在 Win32K.sys 上运行 verifier.exe 调试打印机驱动程序。
音频驱动程序调试
请注意以下有关音频驱动程序调试的信息:
HID 驱动程序调试
请注意以下有关 HID 驱动程序调试的信息:
- 它需要可调试的内部版本系统或可调试的内部版本 HID 模块。
- 在基于 Windows 2000 和 Windows XP 的系统上,通过调试器来设置相应的全局变量。例如:
ed HIDCLASS!dbgverbose 1
收起该表格展开该表格
| 模块名称 | 调试符号 | 范围 |
|---|
| HIDUSB.SYS | HIDUSB_DebugLevel | 0-1 |
| HIDCLASS.SYS | dbgverbose | 0-1 |
串行驱动程序调试
请注意以下有关串行驱动程序调试的信息:
- 它需要可调试的内部版本系统或可调试的内部版本串行模块。
- Serial.sys(在基于 Windows 2000 和 Windows XP 的系统上):
- 设置注册表中的“DebugLevel”值,如下所示:
HKLM\System\CCS\Services\Serial “DebugLevel”= REG_DWORD:0xFFFFFFFF
或通过调试器进行设置,如下所示:ed Serial!SerialDebugLevel (0x00000000 – 0xFFFFFFFF)
- 掩码值在以下目录中定义:
%DDKROOT%\src\kernel\serial\serial.h
- Serenum.sys(在基于 Windows 2000 和 Windows XP 的系统上):
调制解调器驱动程序调试
若要在基于 Windows 2000 和 Windows XP 的系统上启用全面的 unimodem 详细调试,需要使用可调试的内部版本,然后执行以下操作:
- 对于除 Mdminst.dll 和 Unimdm.tsp 之外的所有文件,添加以下注册表项:
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Unimodem "DebugFlags"=dword:0000003f
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon "SFCDisable"=dword:00000001
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Modem "DebugFlags"=dword:0000003f
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Modemcsa "DebugFlags"=dword:0000003f
- 对于 Mdminst.dll,将 Unimdm.ini 复制到 %windir% 中。下面是一个 Unimdm.ini 文件的示例:
[ModemUI]
; DumpFlags:
; 00000001 DCB
; 00000002 MODEMSETTINGS
; 00000004 DEVCAPS
DumpFlags=0x0000000f
; TraceFlags:
; 00000001 Warnings
; 00000002 Errors
; 00000004 General
; 00000008 Function trace
TraceFlags=0x0000000f
; BreakFlags:
; 00000001 Break on validate
; 00000040 Break on process attach
; 00000100 Break on API enter
BreakFlags=0x00000000
;; --------------------------------------------------------------------
[Modem]
; DumpFlags:
DumpFlags=0x0000000f
; TraceFlags:
; 00000001 Warnings
; 00000002 Errors
; 00000004 General
; 00000008 Function trace
; 00010000 Detection queries
; 00020000 Class installer trace
TraceFlags=0x0003000f
; BreakFlags:
; 00000001 Break on validate
; 00000040 Break on process attach
; 00000100 Break on API enter
BreakFlags=0x00000000
;; --------------------------------------------------------------------
[SerialUI]
; DumpFlags:
; 00000001 DCB
DumpFlags=0x00000000
; TraceFlags:
; 00000001 Warnings
; 00000002 Errors
; 00000004 General
; 00000008 Function trace
TraceFlags=0x00000000
; BreakFlags:
; 00000001 Break on validate
; 00000040 Break on process attach
; 00000100 Break on API enter
BreakFlags=0x00000000
;; --------------------------------------------------------------------
[Unimdm]
; DumpFlags:
DumpFlags=0x0000000f
; TraceFlags:
; 00000001 Warnings
; 00000002 Errors
; 00000004 General
; 00000008 Function trace
; 00010000 dwDeviceID related
; 00020000 hdLine related
; 00040000 hdCall related
; 00080000 pLineDev related
; 00100000 pModemInfo related
TraceFlags=0x001f000f
; BreakFlags:
; 00000001 Break on validate
; 00000040 Break on process attach
; 00000080 Break on process detach
; 00000100 Break on API enter
BreakFlags=0x00000000
- 对于 Unimdm.tsp 调试,添加以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318}\device instance\Logging
设备安装调试
若要从 Windows XP 和更高版本上的内核和用户模式 PNP 管理器中接收详细跟踪,必须获取可调试的内部版本,然后运行以下代码:
ed NT!Kd_NTOSPNP_Mask 0xFFFFFFFF ed NT!Kd_PNPMGR_Mask 0xFFFFFFFF
在 Windows 2000 上,您可以在内核调试器中将全局变量“PnpEnumDebugLevel”设置为“1”或“2”,如下所示:
ed nt!PnpEnumDebugLevel 2
注意
在基于 Windows XP 的系统上,某些驱动程序和子系统使用新的“DbgPrintEx”函数:
ULONG DbgPrintEx(IN ULONG ComponentID,
IN ULONG Level, IN PCHAR Format, . . . .
[arguments]);
Microsoft 定义了大约 95 个不同的组件 ID(请在 Ntddk.h 文件中查找“DPFLTR_TYPE”)。对于每个组件筛选器 ID,都有一个全局掩码变量,例如:
NT! Kd_IHVVIDEO_Mask, NT!Kd_IHVAUDIO_Mask
可以通过注册表设置掩码的值,如下所示:
HKEY_LOCAL_MACHINE\SYSTEM\CCS\Control\Session?Manager\Debug?Print?Filter
““IHV_AUDIO”=REG_DWORD:0xFFFFFFFF”,也可以使用调试器进行设置,例如:
ed NT!Kd_IHVAUDIO_Mask 0xffffffff
筛选调试输出时基于全局掩码 (Kd_Win2000_Mask) 和组件级别掩码。Windbg 帮助文件记录了如何在筛选输出中使用掩码和级别值的有关信息。
若要启用调试跟踪,请使用以下代码从 Ntddk.h 文件或调试器中找到您的组件 ID:
然后将值设置为详细输出的最大值 (0xffffffff)。目前,只有少数几类驱动程序(在本文的“更多信息”部分进行了描述)使用这个新函数。