一、实验环境
- 调试机:Windows 11操作系统(我电脑上使用的系统);
- 被调试机:Windows 7操作系统(VMware中安装的系统);
- 调试工具:WinDbg(微软官网下载).
二、被调试机配置
- **关闭(关机)**你的 Win7 虚拟机。
- 点击虚拟机的 "编辑虚拟机设置"。
- 点击下面的 "添加..." (Add...) 按钮。
- 选择 "串行端口" (Serial Port),点击下一步。
- 选择 "输出到命名管道" (Output to named pipe),点击下一步。
- 设置如下:
- 命名管道:填入
\\.\pipe\com1 - 第一个下拉框选:该端是服务器 (This end is the server)
- 第二个下拉框选:另一端是应用程序 (The other end is an application)
- 命名管道:填入
- 非常重要 :在串口设置页面,一定要勾选右上角的 "轮询时放弃 CPU" (Yield CPU on poll)。
- 点击确定保存。
三、在Win7虚拟机内开启串口调试
- 启动 Win7 虚拟机。
- 打开"开始"菜单,搜索
cmd,右键点击 cmd 选择"以管理员身份运行",执行以下命令。 - 重启,当出现黑底白字的启动菜单时,先用上下方向键停在菜单上,不要进系统。
bash
bcdedit /copy {current} /d Windows7-2mdebug -------> 创建一个新的引导项
bcdedit /timeout 10 -------> 设置超时时间为10s
bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS -------> 关闭强制数字签名
bcdedit /set testsigning on -------> 开启系统测试模式
bcdedit /debug on -------> 开启调试功能
bcdedit /bootdebug on -------> 开启调试功能
bcdedit /dbgsettings -------> 查看调试配置
bcdedit /dbgsettings serial debugport:1 baudrate:115200 -------> 设置调试端口为1,波特率为115200
四、在你的实体机(Win11)上连接调试
- 在你的实体机 上安装最新版的 WinDbg(可以直接在微软应用商店 Microsoft Store 搜索
WinDbg下载安装 WinDbg - Windows drivers | Microsoft Learn)。 - 在实体机上以管理员身份打开 WinDbg。
- 点击菜单栏 File -> Attach to kernel。
- 切换到 COM 选项卡,设置如下:Baud Rate:
115200;Port:\\.\pipe\com1;勾选 Pipe (管道);勾选 Reconnect (重新连接) - 点击 OK 。此时实体机上的 WinDbg 会显示
Waiting to reconnect...。 - 最后,回到 VMware 窗口,按下回车让 Win7 启动。
五、下载符号
在双机调试模式下,只要虚拟机在"自由运行",你是不能在 WinDbg 里输入命令的(所以底下显示 BUSY)。如果你想输入调试命令,你必须先**"冻结"**虚拟机的内核。
操作步骤如下:
-
暂停内核(Break入断点): 在 WinDbg 的顶部菜单栏(Home 选项卡),找到一个 "暂停"图标(⏸️ Break) ,点击它。 (点完之后,你的 Win7 虚拟机会瞬间卡住,鼠标完全动不了------不要慌,这是内核被你成功冻结了,是正常现象!)
-
下载符号(现在你实体机的网络没问题了): 冻结内核后,WinDbg 底部的输入框就可以用了,提示符会变成
kd>。 依次输入这两条命令并回车(新版 WinDbg 只需要最简单的命令即可):.symfix .reload /f等待进度条跑完,符号很快就能下载好。
-
让虚拟机恢复运行(Go): 如果你想让虚拟机解除冻结、继续运行,只需在
kd>后面输入字母g(代表 Go),然后回车;或者点击顶部菜单栏的 "播放"图标(▶️ Go)。你的 Win7 虚拟机就会瞬间复活!
六、以后每次使用的"开机三步曲"
第一步:先让 WinDbg "蹲点守候"
- 在你的实体机上,打开 WinDbg。
- 点击菜单 File -> Kernel Debugging(或者直接点击最近使用的连接记录)。
- 确认 COM 选项卡里的设置没变(Port是
\\.\pipe\com1,勾选了Pipe和Reconnect),点击 OK。 - 此时 WinDbg 界面会显示
Waiting to reconnect...(等待重新连接),把 WinDbg 放在旁边不用管它。
第二步:启动虚拟机
- 打开 VMware,正常开启你的 Win7 虚拟机。
- 就在虚拟机刚亮屏、开始加载 Windows 的那一瞬间,你的 WinDbg 就会自动"咔"的一下连上,显示
Connected to Windows 7...。 - 等待虚拟机完全开机进入桌面。此时 WinDbg 底部会显示
*BUSY* Debuggee is running...,表示虚拟机正在正常运行。
第三步:随时冻结,随时调试
当你想要看内核状态、下断点或者输入命令时:
- 点击 WinDbg 左上角的 "暂停" (Break ⏸️) 按钮。
- 此时 Win7 虚拟机画面会完全卡死(被冻结),WinDbg 底部出现
kd>提示符。 - 在
kd>后面输入你的调试命令(比如lm看模块,!process 0 0看进程等),按回车执行。 - 调试完后,在
kd>后面输入g并回车(或者点左上角的 Go ▶️ 按钮),虚拟机瞬间解除冻结,继续正常运行。