-------------------------------------------------------------
基本方式
-------------------------------------------------------------
完成字符串是什么一.Target和Host需要能连通
一般就是用零调制解调器(Null-Modem)连接Target和Host,然后用超级终端来测试一下(选择同样的波特率,连上去,打字看看).
二.Target要能调试方式启动
在原来的boot.ini文件里除了原来正常的启动行外,新加一行,其最后加上新的参数:
/DEBUGPORT=com1 /BAUDRATE=115200
一般是这样的,如果不行,就调整参数,把其他的启动参数都去掉,就剩下/fastdetect和这些新加的参数.
如果运行的是调试版的windows(很难得到),那么参数还得加上:
/Kernel= /HAL=
三.Host设置
1.符号
WinDBG是符号调试器,你得设置好要调试的驱动程序和操作系统的符号信息,才能让WinDBG很好的工作.
File/Symbol File Path菜单里,在对话框里输入符号文件的路径;可以输入一个路径或者多个(用;分隔);
要获取自己要调试的驱动的符号文件很简单,因为每次编译都有一个.pdb文件,你只要告诉windbg这个符号文件的位置就可以了
(或者你把这个pdb文件拷贝到设置好了的windbg的symbol file path对应的路径下,也可以).
而对于操作系统的符号路径,微软有符号服务器来自动和你系统对应的符号文件,所以最好是用:
SRV*D:\Symbols\websymbols*msdl.microsoft/download/symbols
来自动下载.因为sp版本,hot fix都有可能影响更新对应的符号文件,所以最好让符号服务器自动来做.
(它是你需要什么符号,就自动下载对应版本的给你).
2.源码
设置好了符号文件路径,下面就是设置源码路径了.这个路径允许调试器在crash发生或者动态断点触发的时候显示源码.
File\Source File Path菜单里,在对话框里输入源码路径;可以输入一个路径或者多个(用;分隔);
3.调试哪个Target
要告诉WinDBG去调试哪个Target.
WinDBG可以调试应用程序,崩溃转储文件,远程调试,以及内核调试.
内核调试的话,File/Kernel Debug,有三个选项卡,选择COM,输入好信息.
注意这里的Port不是Target上的Port(boot.ini里那指定的),而是Host上要连接到Target的COM PORT,这两个Port是看实际机器的情况的.
波特率要和Target一致;
4.开始调试
一旦设置好了调试接连参数(三.3),点击OK按钮.
WinDBG将显示消息表示它在等待 reconnect(重新连接).
如果Target已经reboot到调试模式下,你将能通过Debug\Break菜单强制WinDBG去控制Target System.
如果Target还没有reboot到调试模式下,你能在任何时候这么做(在Target上去reboot,并且用debug模式进行reboot),Windbg将自动在Target boot的时候连接上去.
-------------------------------------------------------------
VMWare方式单机调试
-------------------------------------------------------------
这可是好东西,可以让Wi
nDbg进行单机调试(比live kd好用多了,live kd那种模拟crash dump的机制有点烦).
基本就是通过WinDBG支持的pipe进行调试,在wmware虚拟系统里,虚拟一个com口,通过这个虚拟的com口进行调试.
1.设置vmware的虚拟com
编辑虚拟机器设置,点击""来运行vmware的硬件向导,选择"serial port"后next,选择第三项:Output to named pipe然后next,
第一框里保持默认的"\\.\pipe\com_1",第二框选择"This end is the server.",第三框里选择"The Other end is an application",
选择"connect at power on",然后点击"Advanced>>",出现的对话框中选中"Yield CPU on poll".
最后点完成.
重新启动一下.
2.设置Target os
power on 在1中搞好的虚拟机,编辑下面的boot.ini
其中 " multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect "
是原来的行。
" multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional - debug" /fastdetect /debug /debugport=com1 /baudrate=115200 " 是我新加的将来用于 WinDbg 调试的行。
注意,com1是因为我们虚拟的就是com1.
在设备管理器中把COM1端口的速度(也就是每秒位数 项),设为上面一样的115200.
3.设置WinDbg
我们需要告诉WinDbg通过pipe进行连接和连接的速度。可以在命令提示符()下加参数
-k com:port=\\.\pipe\com_1,baud=115200,pipe 运行WinDbg(VMware Support 中没有提到 baud=115200 这个参数,其实这是个比较重要的参数)。
更方便的方法是在桌面建立一个WinDbg的快捷方式,在该快捷方式的属性,"目标"框中,加上参数 -k com:port=\\.\pipe\com_1,baud=115200,pipe 。
这样运行这个快捷方式启动的WinDbg就完成了设置。参数的具体作用,可以参考 WinDbg 的帮助文件。
4.推荐的操作顺序
A.运行VMWare,启动Target,到系统选择时(就是你有多个引导选项了,boot.ini),选择有Debug的那个,但是不要回车确认.
B.通过刚才设置好的快捷方式运行WinDbg.
C.在Target OS上选择有Debug的项目,回车确认.
D.稍等片刻就连接上了,如果很长时间都没有连接上的话,按Debug\Kernel connection\Resynchronizer
E.现在可以Debug\Break了,可以向WinDBG下命令了.
-------------------------------------------------------------
将目标机的用户态调试重定向到宿主机的内核调试器
-------------------------------------------------------------
1.先完成虚拟机(目标机)和宿主机(真实机)关于内核调试的设置,也就是上一个章节中描述的vmware单机调试;
2.在目标机上也安装windbg.
3.要重定向用户态调试到核心态,需要在目标机器中使用用户态调试程序ntsd,加上-d参数。
例如:
首先在VM中启动notepad,然后用ntsd –d – 启动用户态调试,-d参数重定向调试到核心态。当摁下ntsd命令的回车后,notepad和目标OS都会同时挂起。
在调试会话中,会看到用户态调试的输出,以及用户态调试器的提示符0:000>。这个时候可以输入用户态调试命令进行调试。
4.如何在用户态和核心态调试中切换?
用户态->核心态  用  .breakin 命令,该命令切换到核心态调试器下,当前进程环境是目标机上的ntsd.
核心态->用户态  用  g 命令就可以了
5.用户态进程退出的时候,中断到调试器的用户态调试环境中,这个时候无法使用g命令,可以用q命令退出用户态调试环境.
---------------------------
为什么要搞这个玩意?
对某些用户态的程序来说,并不是可以方便地启动普通用户态调试器进行调试。比如Windows Services, WinLogon进程,以及其它先于Windows桌面和用户界面模块启动的进程。对于这样的程序来说,由于需要调试的时机先于用户态界面,就无法启动普通的用户态调试器进行调试。
对于某些系统模块来说,直接使用用户态调试器进行调试,可能导致死锁。比如进程是控制Windows认证的用户态进程。调试程序本身需要一定权限,也是要进行认证的。如果用用户态进程调试,首先需要认证,但是管理认证的进程又是正在被调试的
需要同时监视用户态程序和核心态的问题,把两者合在一起显然是一种很好的办法。
---------------------------
6.如果需要对某些用户态进程进行自动重定向,而不是每次都运行ntsd,可以通过修改“Image File Execution Options”完成。比如建立notepad子键,创建字符串键值,名称为debugger,值为” C:\ –d”。这样每次notepad启动的时候,ntds就会自动启动进行重定向。如果需要忽略进程每次启动和结束时候的调试事件,可以加上-g和-G参数。
对于用户态态调试,如果觉得在kernel session中不方便,可以通过.dump命令把用户态dump保存下来,
然后用普通的用户态调试器检查。
例如:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\WinLogon.EXE\Debugger to:
ntsd -d -x -g
-----------------------------------------------------------------
下面是一个实际的XP的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="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200
-----------------------------------------------------------------
下面是一个实际的vista的例子
-----------------------------------------------------------------
在Vista中已经全面采用Bo
otConfig的工具, 所以要设定 Kernel Debug必须遵照以下的步骤才能设定成功.
(1) 执行 Command Prompt 时, 以 Administrator 的身份. 因为只有 Administrator 身份才有权限改变 Boot Config, 其它的 Account 都不行 (即使是具有 Administrator 的权限也不行).
(2) 使用 bcdedit /dbgsettings 查看现在的设定值 ( Default 为 COM1, 115200 ), 可以更改为自行的设定, 命令为 bcdedit /dbgsettings 1394 channel:23 (例: 使用 1394, channel 为 23).
一般不需要修改。
(3) 复制一个开机选项, 命令为 bcdedit /copy {current} /d DebugEntry , DebugEntry为选项名称, 可以自行命名. 然后将结果的 GUID 值复制一份.
(4) 使用 bcdedit /debug {(GUID)} ON 命令将此选项的 Debug 功能打开. 参数 /debug 后面接的 GUID 值为步骤 (3) 的结果.
(5) 改变开机选项的次序, 命令为 bcdedit /displayorder {current} {(GUID)}.
这一项其实一般不用执行。
(6) 使用 regedit 更改 registry 的项目. 在 HKLM"SYSTEM"CurrentControlSet"Control"Session Manager 的子机码下增加一个 Debug Print Filter 的 Key, 然后在这个 Key 之下增加一个 DEFAULT 的 ValueName, 并且设定此 Value 为 REG_DWORD 的型态, 其值为 0x00000008
这点比较重要,否则你在程序中使用DbgPrint输出的信息,在主机端将看不到。
(7) 重新开机, 就可以使用 Kernel Debug 了!!!!!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。