WinDbg 随笔 002 —— WinDbg 之 只为抓 dump

声明:个人笔记,概不负责

术语背景介绍

WinDbg 把当前装了 WinDbg 的工作机称为 Host ,把需要被调试的的机器 称为 Target

此处,我用 DUT 来称呼 要被抓 dump 的机器。

有些环境中,有些人用 DUT (Device under Test) 来称呼被测试的机器。
吐槽:有些人用 SUT (System under Test)来称呼被测试的机器。
飞线吐槽:USB-C Cable and Connector spec 中,把主测设备称为 DTS (Debug and Test Sytem),把被测设备称为 TS (Target System)
Copilot 解释:DUT 源自 硬件行业,SUT 源自 软件行业。

遇到这种,只为抓 dump 这一个目的时,通常操作人员为
(1)非软件专业人士;或
(2)软件专业人士,但对方不想让你知道任何细节,或对方只想拿个 dump 去找人掐架。


此文,主要为第一类 从业人员“赐福”


此处,把抓 dump 难度等级分为 三级
(一)简单之 Windows 崩溃
(二)不简单之 Windows 崩溃
(三)不简单之 WinPE 崩溃

非软件专业的,看第一级的就行,后面的可以权当看戏。

为往生铺路,为“知识”平权

首先在 Host 机器上 安装 WinDbg ,本文用 WinDbg Preview 版本。
在 Host 机器上,通过 Microsoft Store 安装 WinDbg 简单傻瓜,虽然本节 Title 如此之大,但这装软件实在没啥讲的,网上一大把文章。
唯一要注意的,在有特色的网络环境下,装这玩意 有时有点慢。

一、简单之 Windows 崩溃

在这一级中,DUT 已经做好一切设置,我们只需简单用 Host 连接上去,抓 Dump 就行。
这样,不能到达现场、或不能远程操作、或远程操作极其痛苦的 软件人员,就可以慢慢分析。

在这一级中,DUT 的 Windows 通常可以正常启动进桌面,然后触发崩溃行为。但
(1)这崩溃莫名奇妙的,不能被 Windows 自身 dump 机制捕获,留不下记录;
(2)或等 Windows 自身 dump 时,已经太晚太晚;
(3)或实在没办法到 DUT 上去捞 dump 文件。
在这一级中,即使 DUT 的 Windows 没有正确设置,从业人员也有机会在这里设置好后,择机让 DUT 崩溃。
这种系统的设置,傻瓜简单,系统已经设好,或 让你抓的人已经提供了一切设置指导。
—— 关于设置,看后面的 “不简单之 WinPE 崩溃”一节。

总之,此时我们需要,通过 WinDbg 抓 dump 文件。

Step-000 准备

假设 DUT 都已经设置好,并且用所选择的连接方式,连接到装了 WinDbg 的 Host 机器。
(注意,DUT 自己不需要装 WinDbg 软件,它只需要 设置 Windows 启动参数)

Step-001 打开

在 Host 启动 WinDbg Preview 软件,然后选择 Kernel Mode 方式连接,然后 点击 Ok 按钮
(此处以 net 方式为例,这个比较快)
(有个 坑人不浅的 bug ,目前这个界面下 Enter 按键不起作用,只能点 Ok 按钮启动,以前是可以的。)

001-Set-Conn-by-net

Step-002 等待

在 Host 上的 WinDbg 进入等待状态,这时候可以去折腾 DUT 了
002-Wait-conn

Step-003 挂上

它们相会了

003-Connected

Step-004 择机而抓

Host 开始干活了
004-Capture-dump-to-host-disk

Step-005 抓成功的 例子

Host 活干完的例子。接着就是 Copy、压缩、传递 文件了,最好压一压,一般会小很多。
005-Completed-example

Step-006 避坑指南

如果 Host 还能联网,对“只为 抓 Dump ”而言,这不一定是好事。
在有特色的网络环境下,这可能是个 巨坑。
006-trick-for-dump

二、不简单之 Windows 崩溃

在这一级中,Windows 已经糟糕到无法在 DUT 上启动,如果 Windows 当初没有正确设置,根本没有机会挂 WinDbg 去抓 Dump 文件。

如果 装在 DUT 上的 Windows 所在存储是可拆卸的,如 NVMe SSD 卡,这时候有三种方法挽救,
一、拔下来,塞到 SSD 读卡器里,挂到工作机上(可以是 Host 或任何机器),把它当 USB 盘处理
二、拔下来,插到另一台机器上,启动进 Windows 后,再去设置。(有点,不靠谱)
三、在这台 DUT 上,用 WinPE 启动,如果 WinPE 能启动的话,在 WinPE 里操作 DUT 上的存储。

如果 装在 DUT 上 Windows 所在存储,是不可拆卸的,如焊在板子上的 NVMe 芯片,或 UFS 芯片,
—— 只有上述第三种方法可行。

还有一种理论上的方法,UEFI Shell 方法。用 UEFI Shell 启动盘,或系统自带进入 UEFI Shell 功能,启动到 UEFI Shell 的环境下,用一个 UEFI Application 去更改 Windows 的启动设置。
这种方法本质上与 第三种方法是一样的,但这个神奇的修改 bcd 的 UEFI Application 有没有是个问题。
第三种 WinPE 方法,唯一痛苦点就是 如何找到,正确的、在 DUT 上的 Windows 启动设置所在盘。

这里简单讲一讲,第一种 SSD 读卡器方法。如何找到,正确的、是在 DUT 用的那个 NVMe 盘的、Windows 启动设置所在分区。(而不是,在折腾你自己的机器!)

这里用到神奇的 moutvol 命令,在挂了 SSD 读卡器的机器上,以管理员方式打开 cmd 命令窗口,然后这么搞。
(为避免搞到自己的机器,可以在没挂 SSD 读卡器前,找到类似盘时,在上面造个目录或文件,做标记)

mountvol /?

::尝试挂载 volume
mountvol h: \\?\Volume{07430000-0000-0000-0000-0000000000c4}\

::删除挂载的 volume 
mountvol h: /d

::修改移动硬盘上 BCD 选项

cd /d h:

这个神奇的,保存 Windows 启动设置的盘,称为 ESP (EFI System Partition) ,分区是 FAT32 文件系统。
此处已踏入 软件专业人员领域,搞硬件的可以完全不用管,理由非常正当,全能型选手可以继续搞。
孜孜不倦的从业人员,还想知道细节,可进入第三级,因为主要操作一模一样。

三、不简单之 WinPE 崩溃

如果系统是用 USB 上的 WinPE 启动,然后再往 DUT 上灌系统的话,WinPE 崩溃,已进入极度灾难情况,带人的人 自己崩溃,悲惨之至。
但它的 Windows 启动设置,倒是意外清奇的简单。

如果 WinPE 安装启动盘,自身运行时崩溃,需要为 WinPE 设置 WinDbg 启动参数,可以用来 debug 安装时的 BSOD 或 抓 dump 文件。
这种设置其实,也比较简单。把 USB WinPE 启动盘,插到工作机上,然后用管理员方式打开 cmd 命令窗口(不是 PowerShell 命令窗口!)


假如 WinPE 安装启动盘,插到 Host 上,是 E:

cd /d E:

====
# 假设 DUT 是通过 USB 模拟 网卡 接到 Host 上,用以下参数
# 大多数情况,选对 USB Cable 会很快,用真 USB 3.0 Cable  

bcdedit /store .\EFI\Microsoft\Boot\bcd /set {default} bootdebug on
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {default} debug on

bcdedit /store .\EFI\Microsoft\Boot\bcd /set {default} dbgtransport kdnet.dll
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {default} loadoptions "EEM"
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {dbgsettings} busparams 1
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {dbgsettings} debugtype NET
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {dbgsettings} loadoptions "EEM"
bcdedit /store .\EFI\Microsoft\Boot\bcd /dbgsettings NET HOSTIP:169.254.255.255 PORT:50000 KEY:1.2.3.4
	   
bcdedit /store .\EFI\Microsoft\Boot\BCD /set {bootmgr} displaybootmenu yes
bcdedit /store .\EFI\Microsoft\Boot\BCD /set {bootmgr} timeout 10
	   
bcdedit /store .\EFI\Microsoft\Boot\BCD /enum {dbgsettings}

====
# 假设 DUT 是通过 COM 串口接到 Host 上,用以下参数
# 极端情况用这个终极手段,会很慢,但至少能抓
 
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {default} bootdebug on
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {default} debug on 

bcdedit /store .\EFI\Microsoft\Boot\bcd /set {default} dbgtransport kdcom.dll 
bcdedit /store .\EFI\Microsoft\Boot\bcd /dbgsettings serial baudrate:115200 debugport:1 
bcdedit /store .\EFI\Microsoft\Boot\bcd /set {dbgsettings} debugstart Active
	   
bcdedit /store .\EFI\Microsoft\Boot\BCD /set {bootmgr} displaybootmenu yes
bcdedit /store .\EFI\Microsoft\Boot\BCD /set {bootmgr} timeout 10
	   
bcdedit /store .\EFI\Microsoft\Boot\BCD /enum {dbgsettings}

====
# 假设 DUT 是通过 xxx 接到 Host 上,用以下参数
# (抓 dump 的人,问叫你干这件事的人 确认参数)
# (软件专业人士,这里就是 装逼 的地方)
#

====
至于这些命令啥意思,哪里要调整,输入后怎么知道对不对?
那就是 软件专业人士 的领域,干硬件给干软件的留口饭吃吧,可以咨询 软件专业人士。
软件专业人士,可以咨询 互联网,或 AI 查询。

参考资料
https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/setting-up-kernel-mode-debugging-over-usb-eem-arm-kdnet

四、不简单之 Windows 崩溃 之 first boot

在 WinPE 成功往 DUT 灌录系统后,DUT 上 Windows 首次启动,在安装过程中崩溃。
而且,后继再也不能复现同样的问题。

这个,就进入 专业软件从业人员领域,该专员 在往 DUT 上灌系统时,就得直接修改设置,以确保第一次启动参数就起效。
(注意这不同于 DUT 上的 Windows 第一次正常启动后,运行的 Post-Deploy 之类脚本,所做的修改)

这对我已经超纲,我也就是吹吹牛。

五、不简单之 UEFI 崩溃

补充:
如果系统糟糕到,直接在 UEFI 阶段挂掉,已经超越本文维度。
WinDbg 是 for Windows OS 的。
请联系 相关软件从业人员,给彼此一个机会。

====
华丽的 结束线

posted @ 2025-11-17 09:57  悠洋洋  阅读(161)  评论(0)    收藏  举报