使用WinDbg进行Kernel Debug
发表于 2006-01-22 04:35 AM 作者: polyrandom
最近很倒霉,遇到一个随机蓝屏(BSoD)的bug,大家都被弄得焦头烂额,于是我想到了kernel debug。
下面是我今天使用WinDbg进行kernel debug所作的:
1.准备两台电脑,一台被调试(target),一台运行调试程序(host);
2.在两台电脑的COM口上连上Null Modem线(也可以用USB和1394,不过我没试验过),用Hyper Terminal测试一下。下面假设target的COM口是COM1,host是COM2;
3.在host上面安装WinDbg(可以去这里免费下载);
4.修改target的boot.ini,最简单的方法就是把缺省的启动选项copy成一个新的,譬如说我缺省的是:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn
我复制到下一行,然后加上调试参数,变成:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Kernal Debug" /fastdetect /NoExecute=OptIn /debug /break /debugport=COM1 /baudrate=115200
其中,/debug启动调试模式, /break告诉Windows在启动时停在一个断点上,这样我们可以在host上运行WinDbg并且挂上这台电脑,然后再选Debug->Go 继续运行,这时候target就可以继续启动。最后两个参数指定了target上所使用的COM口(和host的不一定相同)以及波特率(和host的相同)。
5.重新启动target,在启动菜单选择新加入的选项;
6.在host上面运行WinDbg,选择File->Kernel Debug,然后输入host的COM口(这里是COM2)和波特率;
7.等到连接上了,可以看到会断在一个int 3上,选择Debug->Go让target继续运行。
到这里就一切完成了,一旦target遇到BSoD,在core dump以后就会断在host的WinDbg里面。为了满足大家随时蓝屏的需要,MS体贴地提供了一个方法:
在你的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\ Parameters下面创建一个值CrashOnCtrlScroll=1,然后重新启动,这样你每次按下CTRL然后按两次Num Lock就可以人为制造一个BSoD。注意,这个只对PS2键盘有效。
还有很多细节的设置可以使你的调试经历更为有趣,请参阅WinDbg文档。
下面是我今天使用WinDbg进行kernel debug所作的:
1.准备两台电脑,一台被调试(target),一台运行调试程序(host);
2.在两台电脑的COM口上连上Null Modem线(也可以用USB和1394,不过我没试验过),用Hyper Terminal测试一下。下面假设target的COM口是COM1,host是COM2;
3.在host上面安装WinDbg(可以去这里免费下载);
4.修改target的boot.ini,最简单的方法就是把缺省的启动选项copy成一个新的,譬如说我缺省的是:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn
我复制到下一行,然后加上调试参数,变成:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Kernal Debug" /fastdetect /NoExecute=OptIn /debug /break /debugport=COM1 /baudrate=115200
其中,/debug启动调试模式, /break告诉Windows在启动时停在一个断点上,这样我们可以在host上运行WinDbg并且挂上这台电脑,然后再选Debug->Go 继续运行,这时候target就可以继续启动。最后两个参数指定了target上所使用的COM口(和host的不一定相同)以及波特率(和host的相同)。
5.重新启动target,在启动菜单选择新加入的选项;
6.在host上面运行WinDbg,选择File->Kernel Debug,然后输入host的COM口(这里是COM2)和波特率;
7.等到连接上了,可以看到会断在一个int 3上,选择Debug->Go让target继续运行。
到这里就一切完成了,一旦target遇到BSoD,在core dump以后就会断在host的WinDbg里面。为了满足大家随时蓝屏的需要,MS体贴地提供了一个方法:
在你的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\ Parameters下面创建一个值CrashOnCtrlScroll=1,然后重新启动,这样你每次按下CTRL然后按两次Num Lock就可以人为制造一个BSoD。注意,这个只对PS2键盘有效。
还有很多细节的设置可以使你的调试经历更为有趣,请参阅WinDbg文档。
评论总数 5
评论
| | "在你的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\ Parameters下面创建一个值CrashOnCtrlScroll=1,然后重新启动,这样你每次按下CTRL然后按两次Num Lock就可以人为制造一个BSoD。注意,这个只对PS2键盘有效。” Num Lock? ScrollLock == NumLock? |
发表于 2008-01-18 04:04 PM 作者: zweily |
| | Sorry, it is Scroll Lock |
发表于 2008-01-18 04:05 PM 作者: polyrandom |
| | 可以试试vmware,这样就不需要两台机器了,一般情况下,效果没有区别 |
发表于 2008-01-18 04:14 PM 作者: jeff |
| | 我们公司不给用盗版软件:’(,否则使用vmware会方便很多,我过去做一些DDK上面的东西都是VMWare的,这样不会出大问题。 不过这次的bug VMWare帮不上很大的忙,因为主要是一个显示方面的bug。vmware里面的县卡驱动估计不一样。 |
发表于 2008-01-18 04:15 PM 作者: polyrandom |
| | 可以用microsoft virtual pc呀,它现在免费,网上也有它的中文语言包 |
| 发表于 2008-01-18 04:16 PM 作者: 李天东 |
发表评论 |
作者为 polyrandom 的最新文章
- 调试艺术 (2008-04-19)
- operator==的误用? (2007-04-07)
- 体育彩票的概率 (2007-03-10)
- 初始化错误 - 线程和同步变量 (2007-02-28)
- EPSILON的管理 (2007-02-03)




