cc682/NetRoc
http://netroc682.spaces.live.com/
绕过引导选项
可能会遇到必须调试一台没有配置为内核调试的机器,但是又不能编辑引导选项的情况。
例如,可能一台机器在到达登陆界面之前就已经蓝屏,使得不能通过Windows来修改Boot.ini文件。可以从软盘启动Microsoft MS-DOS,但是硬盘引导分区是NTFS格式,不能通过MS-DOS编辑Boot.ini。
当不能直接编辑引导选项时,将机器重起并等到BIOS初始化过程完成。这时,如果机器中安装了多个操作系统,就可以看到引导菜单。当菜单出现时,按下F8键。如果没有多个引导选项,引导菜单不会显示出来,但是仍然可以在Windows加载的前2秒之内按下F8——在BIOS初始化接近完成的时候就开始不停的按下F8,并一直持续到菜单出现会更容易一些。
按下F8会使得故障排除和高级设置选项菜单被显示出来。其中有一个选项为调试模式(Debugging Mode)。如果选择了这个选项,就可以启动Windows并打开内核调试支持。内核调试器连接会在计数最高的COM端口(例如,如果只有2个端口,则是COM2)以19200的波特率激活。
禁用1394控制器
要使用IEEE 1394(火线)进行内核调试,可能需要禁用目标机上的1394调试器和主控机上的1394网络适配器。所需要的调整由目标机上面运行的操作系统来决定。
当目标机运行Microsoft Windows Server 2003(未安装Service Pack)或者Windows XP SP1,为了使用1394内核调试连接,必须禁用1394控制器。如果运行这些系统上的机器的1394控制器仍然启用,核心1394栈可能会和1394调试连接发生资源冲突,导致调试连接失败或者在引导期迅速断开。
在Windows Vista(所有版本),Windows Server 2003 SP1和Windows XP SP2上,不需要再目标机禁用控制器。 事实上,如果禁用这些操作系统上的控制器,可能是的在某些电源状态转换的时候妨碍调试。
不管主控机运行什么系统,在任何情况下都不要禁用它的1394控制器。
如果在通过1394调试运行Windows Vista之前版本的Windows有一些问题,可以禁用掉主控机上的1394网络适配器。禁用掉1394网络适配器可以解决由于加载1394网络适配器驱动造成的总线重置的环境更新(issue= = Information System and Software Update Environment?)问题。当使用IP1394时,不要禁用1394网络适配器。这种方法在Windows Vista中不存在,因为Vista不支持1394网络适配器。
在目标机上禁用1394控制器
- (仅在Windows Server 2003 (没有安装 service pack) 和Windows XP SP1上)
- 在目标机上,打开设备管理器(Device Manager),既点击开始,运行,并且输入Devmgmt.msc 。
- 找到1394控制器。根据设备管理器里面使用的不同试图,会在不同的地方找到它。一般,可以在PCI 总线(PCI Bus)节点下找到。
- 右键点击1394控制器,并选择禁用(Disable)。
- 重新启动计算机。
注意不要错误的禁用了1394网络适配器。
在主控机上禁用1394网络适配器
- (只在Windows Server 2003 和更早以前的系统上)
- 在目标计算机上,打开设备管理器(Device Manager),既点击开始,运行,并且输入Devmgmt.msc 。
- 展开网络适配器(Network Adapters) ,找到1394 网络适配器(1394 Net Adapter)。
- 右键点击1394网络适配器,并选择禁用。Right-click 1394 Net Adapter, and then click Disable.
- 重新启动计算机
注意 在通过1394电缆进行内核调试之前,还需要在主控机上进行软件配置。更多信息,查看安装1394虚拟驱动。
使用KDbgCtrl
KDbgCtrl (内核调试控制,kdbgctrl.exe)工具可以用来控制目标机上的内核调试连接。
要使用该工具,目标机上必须运行Windows Server 2003或之后版本的Windows。
KDbgCtrl 可以控制4种不同的设置:完全的内核调试,自动内核调试,用户模式错误处理,DbgPrint缓冲区大小。
要使用KDbgCtrl,必须在启动时已经在引导配置中启用了内核调试。如果没有这样,KdbgCtrl不能用于启用内核调试。更多细节和配置,查看 用于启用调试的引导参数 。
完全的内核调试
当完全内核调试启用时,主控机上运行的内核调试器可以中断目标机。目标机在发生内核模式异常时也会中断。从目标机到主控机的消息,如DbgPrint的输出、符号加载信息和重定向的用户模式调试器都可以使用。
如果该设置禁用,则目标机跳过所有来自主控机的信息。
完全内核调试默认被打开。要查看当前设置的值,使用kdbgctrl -c 。禁用设置,使用kdbgctrl -d 。启用设置,使用kdbgctrl –e。
如果要检查当前配置并在批处理文件中用来控制执行,可以使用kdbgctrl -cx 命令。关于该命令的更多信息,查看 KDbgCtrl命令字符串选项。
自动内核调试
如果完全内核调试打开,则自动内核调试的设置无关紧要,因为所有通信都被允许。
当完全内核调试禁用,自动内核调试启用时,只有目标机可以初始化调试连接。
这种情况下,只有内核模式异常、断点或其他内核模式事件会使得连接被启用。DbgPrint输出、符号加载信息、重定向的用户模式调试器输入输出、或者其它相似信息都不会启用连接,这些信息会保存在DbgPrint缓冲区,而不是发送给调试器。
当异常或某个事件使目标机中断到调试器,完全内核调试被自动打开,如同使用了kdbgctrl -e 命令。
自动内核调试默认被关闭(这是无关紧要的,除非完全内核调试也被禁用)。查看当前设置,使用kdbgctrl –ca。禁用设置,使用kdbgctrl -da 。起用设置,使用kdbgctrl -ea 。
用户模式错误处理
当用户模式错误处理起用,一些用户模式事件会使得目标机中断到内核调试器。
具体来说,所有int 3中断,如调试器插入到代码中的断点或者对DbgBreakPoint的调用会使得中断到内核调试器。但是像访问非法或者除0错误这样的标准异常通常不会被发给内核调试器。
如果用户模式调试器已经附加到进程,调试器会捕捉到所有用户模式错误,不会通知内核调试其。关于各种用户模式错误处理的优先级,查看启用事后调试。
要使用用户模式错误处理,完全内核调试或自动内核调试必须启用。
用户模式错误处理默认是启用的。要检查当前设置,使用kdbgctrl -cu 。禁用设置,使用kdbgctrl -du 。启用设置,使用kdbgctrl -eu 。
DbgPrint缓冲区大小
DbgPrint 缓冲区保存目标机发送给内核调试器的信息。
如果完全内核调试启用,这些信息会在内核调试器中自动出现。但是如果该选项禁用,这些信息只保存在缓冲区中。在之后,可以启用内核调试并连接到内核调试器,并使用!dbgprint扩展命令来查看缓冲区的内容。关于该缓冲区的更多信息,查看DbgPrint缓冲区。
在Windows 发行版中,DbgPrint缓冲区的默认大小是4 KB,在调试版Windows中为32 KB。查看当前的缓冲区大小,使用kdbgctrl -cdb 。修改 大小,使用kdbgctrl -sdb size,size指定新的缓冲区大小。关于语法的详细信息,查看KDbgCtrl命令字符串选项。
示例
显示所有的当前设置,使用下面的命令:
kdbgctrl -c -ca -cu -cdb
恢复默认设置,使用如下命令:
kdbgctrl -e -da -eu -sdb 0x1000
阻止主控机,仅当发生异常时才连接。使用如下命令:
kdbgctrl -d -ea -eu
禁用所有内核调试,使用如下命令:
kdbgctrl -d -da
禁用所有内核调试之后,可能想增加DbgPrint缓冲区的大小。这可以确保当需要查看的时候,所以信息都能被保存下来。如果有1MB的内存剩余,可以使用下面的命令:
kdbgctrl -sdb 0x1000000
在主控机上进行软件配置
本节包含:
选择内核调试设置
安装1394虚拟驱动
安装符号文件
选择内核调试设置
开始内核调试之前,必须选择使用的连接设置。
调试器支持各种不同的内核调试方式:
- 主控机和目标机通过COM端口连接。
- 主控机和目标机用1394电缆连接。这只在主控机和目标机都运行Windows XP之后系统的情况下支持。通过1394电缆调试之前,必须在主控机和目标机上都进行一些软件配置。查看禁用1394控制器和 安装1394虚拟驱动获取更多信息。
- 主控机和目标机通过USB 2.0调试电缆连接。仅当主控机运行Windows 2000及之后的系统,目标机运行Windows Vista及之后的系统时才支持。需要进行更多的配置,查看设置USB 2.0调试电缆连接获取更多信息。
- 主控机和目标机通过modem通信。
- 调试器和虚拟机(在同一台机器或者不同机器上)通过命名管道通信。
- 在单机上进行本地内核调试。这只在Windows XP和之后的系统中支持。
有三种办法可以进行内核调试设置:通过环境变量,通过调试器命令行,或者通过WinDbg图形界面。如果不使用这些方法,调试器默认使用COM1和19200波特率连接。
环境变量
如果通过环境变量设置COM端口连接,需要使用下面两个变量:
set _NT_DEBUG_PORT = Com端口
set _NT_DEBUG_BAUD_RATE = 波特率
通过环境变量设置1394连接,使用下面三个变量:
set _NT_DEBUG_BUS = 1394
set _NT_DEBUG_1394_CHANNEL = 1394频道
set _NT_DEBUG_1394_SYMLINK = 1394协议
不能用环境变量来设置USB 2.0调试电缆连接、通过modem的调试、通过命名管道调试和本地内核调试。
KD 命令行
如果使用KD命令行,可以在-k 命令行选项之后指定连接设置。com:port 参数指定调试器通过COM端口连接。1394 参数指定通过1394电缆连接。usb2 参数指定通过USB 2.0调试电缆连接。com:modem 参数指定通过modem连接。com:pipe 参数指定通过命名管到连接。-kl 命令行选项启用内核调试。如果省略掉这些参数,则使用环境变量或者默认设置。
kd ... -k com:port=Com端口,baud=波特率...
kd ... -k 1394:channel=1394频道[,symlink=1394协议] ...
kd ... -k usb2:targetname=字符串 ...
kd ... -k com:pipe,port=\\VMHost\pipe\PipeName[,resets=0][,reconnect] ...
kd ... -k com:modem ...
kd ... -kl ...
kd ...
WinDbg 命令行
WinDbg 连接参数和KD一样。唯一不同在于,如果想使用环境变量或者默认设置,还是必须指定-k 选项。
windbg ... -k com:port=ComPort,baud=BaudRate ...
windbg ... -k 1394:channel=1394Channel[,symlink=1394Protocol] ...
windbg ... -k usb2:targetname=String ...
windbg ... -k com:pipe,port=\\VMHost\pipe\PipeName[,resets=0][,reconnect] ...
windbg ... -k com:modem ...
windbg ... -kl ...
windbg ... -k ...
WinDbg 对话框
如果WinDbg已经运行并且处于静止状态,可以使用File | Kernel Debug 菜单选项来开始新的内核调试任务。出现的对话框中有三个选项卡:COM, 1394,,和Local。他们每个都指定一种不同的连接方式:
- COM 选项卡指定使用COM端口连接。Baud Rate 文本框内输入波特率,Port文本框内输入Com端口。
- 1394 选项卡指定使用1394连接。在Channel 文本框中输入1394频道。
- Local 选项卡指定WinDbg使用本地内核调试。本地内核调试只在Windows XP和之后版本Windows中支持。
这个对话框不能用来设置USB 2.0调试电缆、modem和命名管道连接。
参数
这些参数由环境变量、命令行选项和WinDbg对话框使用,有下面一些可能的值:
Com端口
指定COM端口的名字。可以是"com2"或者"\\.\com2"这样的形式,但是不能仅仅只有一个数字。
波特率
指定波特率,可以是19200,38400,57600或115200.
1394频道
指定1394频道的数字。合法的频道是从0到62之间的任何整数。1394频道必须和目标机上使用的相同,但是和适配器上的物理1394端口无关。
注意 1394内核调试只在主控机和目标机都运行Windows XP之后系统的情况下支持。通过1394电缆调试之前,必须在主控机和目标机上都进行一些软件配置。查看禁用1394控制器和 安装1394虚拟驱动获取更多信息。
1394协议
指定1394内核连接使用的协议。这个选项几乎总是被省略,因为调试器会自动选择合适的协议。如果想自己设定,并且目标计算机运行Windows XP,1394协议需要设置为"channel"。如果目标机运行Windows Server 2003或之后 的系统,1394协议需要设置为"instance".。如果省略,调试器会选择适合目标机的协议。这个参数只能通过命令行或环境变量设置,不能通过WinDbg图形界面。
字符串
指定USB 2.0连接字符串。必须和/targetname 引导选项指定的字符串相同;查看/debug 获取更多信息。
注意 USB 2.0内核调试仅当主控机运行Windows 2000及之后的系统,目标机运行Windows Vista及之后的系统时才支持。需要进行更多的配置,查看设置USB 2.0调试电缆连接获取更多信息。
VMHost
当调试虚拟机时,VMHost 指定虚拟机运行的物理计算机名。虚拟机文档中一般用virtual machine host 来引用它。如果虚拟机和内核调试器运行在同样的机器上,VMHost可以使用一个点号(.)。
PipeName
指定虚拟机为调试连接创建的命名管道名。
resets=0
指定一个无约束的当主控机和目标机进行同步时发送给目标机的重置包的数量。这仅仅在使用某些特定的虚拟机时需要。查看附加到虚拟机(内核模式)获取更多信息。
reconnect
指定当读/写失败时,调试器自动断开并重连管道。另外,当调试器启动时没有找到指定的命名管到,reconnect 使得它等待这个名字的管道出现。这个参数仅在调试某些特定类型的虚拟机时需要。查看 附加到虚拟机(内核模式)获取更多信息。
modem
指定调试器通过modem连接。
-kl
指定调试器进行本地内核调试。仅当用户具有调试权限时才能启动进程。要使用本地内核调试,x86的boot.ini文件或Itanium的OsLoadOptions 配置必须包含/debug 选项。查看进行本地内核调试获取关于该技术的更多特殊功能。
关于其他有用的环境变量和命令行选项列表,查看环境变量和命令行选项。
示例
下面的批处理文件用来设置COM连接:
set _NT_SYMBOL_PATH=d:\mysymbols
set _NT_DEBUG_PORT=com1
set _NT_DEBUG_BAUD_RATE=19200
set _NT_DEBUG_LOG_FILE_OPEN=d:\debuggers\logfile1.log
kd
下面的批处理用于设置1394连接:
set _NT_SYMBOL_PATH=d:\mysymbols
set _NT_DEBUG_BUS=1394
set _NT_DEBUG_1394_CHANNEL=44
set _NT_DEBUG_LOG_FILE_OPEN=d:\debuggers\logfile1.log
windbg -k
下面的命令行在每种配置下启动KD,不使用任何环境变量:
kd -y d:\mysymbols -k com:modem
kd -y d:\mysymbols -k com:port=com2,baud=57600
kd -y d:\mysymbols -k com:port=\\.\com2,baud=115200
kd -y d:\mysymbols -k 1394:channel=20,symlink=instance
安装1394虚拟驱动
要通过1394连接进行调试,调试器会安装一个1394虚拟驱动用于和目标机通信。
安装有三个步骤:
- 当调试器软件包在系统上安装时,会将特定文件放到调试器安装目录的1394子目录中。
- 第一次使用1394连接启动内核调试时,调试器会进行1394虚拟驱动的预安装。
- 如果预安装成功,调试器调用总线驱动程序。总线驱动程序会完成安装过程。
在第2和第3步,必须以管理员登陆到主控机上,因为只有管理员可以安装新驱动。
有两种不同的1394驱动:一个用于运行Windows XP的目标机,另一个用于运行Windows Server 2003或之后的Windows的目标机。他们分别对应两种不同的1394协议设置。不需要袭击修改协议的配置,它会自动被选择。如果因为某些原因想自定义协议配置,查看选择内核调试设置获得更多信息。
如果通过1394调试Windows XP目标然后又通过1394调试Windows Server 2003(或之后)的目标,在主控机上两种驱动都会被安装。反之亦然。
改变调试器文件的位置
每个1394虚拟驱动都只会被安装一次。
所以,如果安装了Windows调试工具包,并进行过1394调试,就不能把调试器的文件复制到其他机器上。这种复制不会包括通过1394连接调试时需要使用到的1394驱动。
同样的问题也会在拥有双重启动的机器上使用同一份调试器拷贝的情况下出现。
要确保1394调试工作,每台计算机(或者双重启动机器上的每个系统)都应该安装调试工具包。查看调试器安装获取操作方法。
注意 在通过1394电缆进行内核调试之前,还必须在目标机上进行软件设置。查看禁用1394控制器。
安装符号文件
和目标机上安装的操作系统符合的符号文件必须安装在主控机上,或者主控机可以通过符号服务器访问。更多关于符号文件安装的信息,查看符号。