你提到的 debug 命令,通常指的是两种不同的工具:

debug.exe: 一个古老的16位调试器,随早期Windows版本(如Windows 95/98/XP)发布,功能强大但界面简陋,主要用于DOS程序调试和直接操作内存/端口,在64位Windows系统中,它已不再可用。Debugging Tools for Windows: 由微软官方发布的一套现代化、功能极其强大的调试工具包,这是现代Windows开发和故障排查的标准工具,它包含了多个工具,如WinDbg,CDB,NTSD,KD等。
下面我将分别提供这两个工具的实例,但重点会放在现代的 Debugging Tools for Windows 上,因为它更具实用价值。
使用古老的 debug.exe (适用于Windows XP/7 32位)
这个工具主要用于学习和理解计算机底层原理,比如查看BIOS数据、直接读写内存等。
场景1:查看内存中的数据
假设你想查看内存中 0x00400000 地址开始的128个字节的数据。

- 打开命令提示符。
- 输入
debug并回车,进入debug环境。 - 使用
D(Dump) 命令。
C:\> debug -d 00400000 L 80
-d是Dump(转储) 命令。00400000是你想要查看的起始内存地址。L 80表示显示80(十六进制,即128个) 字节。
输出会类似这样,左边是地址,中间是十六进制字节值,右边是ASCII字符表示。
0040:0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ...............
0040:0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ........@.......
... (更多数据)
场景2:汇编语言入门
debug 可以让你直接在CPU上执行汇编指令。
- 进入
debug环境。 - 使用
A(Assemble) 命令进入汇编模式。 - 输入汇编指令,按
Enter键换行。 - 输入一个空行结束汇编模式。
-a 100 0C1D:0100 MOV AX, 1234 0C1D:0103 MOV BX, 5678 0C1D:0106 ADD AX, BX 0C1D:0109 INT 20 ; 程序终止
- 使用
G(Go) 命令执行这段代码。
-g AX=68AC BX=5678 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1D ES=0C1D SS=0C1D CS=0C1D IP=0109 NV UP EI PL NZ NA PO NC 0C1D:0109 CD20 INT 20
可以看到,AX 寄存器的值从 1234 变成了 68AC (1234 + 5678 的结果)。

使用现代的 Debugging Tools for Windows (强烈推荐)
这是目前Windows开发者、IT管理员和高级用户进行调试的首选工具,你需要先从 Microsoft Docs 下载并安装它。
安装后,你会在开始菜单找到 WinDbg Preview 或 x64 Debugging Tools for Windows 等程序。
场景1:分析程序崩溃(蓝屏或无响应)
这是最常见的使用场景,当一个程序崩溃时,Windows通常会生成一个“内存转储文件”(.dmp),我们可以用 WinDbg 分析这个文件,找到崩溃原因。
-
获取转储文件:
- 蓝屏:转储文件通常位于
C:\Windows\Memory.dmp或C:\Windows\Minidump\目录下(文件名类似010720-12345-01.dmp)。 - 程序无响应:可以使用任务管理器创建转储文件(右键点击无响应进程 -> “创建转储文件”)。
- 蓝屏:转储文件通常位于
-
使用 WinDbg 分析转储文件:
- 打开
WinDbg Preview。 - 点击 "File" -> "Open Executable...",然后选择你的转储文件(.dmp)。
- WinDbg 会自动加载符号文件并进行分析,分析完成后,会自动在 "Debugging Help" 窗口显示最可能的原因。
分析示例: 假设一个程序因为访问了无效内存地址而崩溃,分析结果可能如下:
... 0:000> !analyze -v ... ** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - ... ... 1: kd> !analyze -v ******************************************************************************* * * Bugcheck Analysis * ******************************************************************************* CRASH_NAME: 0x000000C4 (0xFFFFF80002D1D5D8, 0x0000000000000002, 0x0000000000000001, 0xFFFFF80002D1D5D8) ... DRIVER_POWER_STATE_FAILURE (c4) ... **Followup: MachineOwner **BucketId: 0x9F_driver_power_state_failure ... Caused by driver: nvlddmkm.sys (NVIDIA Kernel Mode Driver) ...解读:
Bugcheck Analysis:指出了蓝屏错误名称CRASH_NAME: 0x000000C4,即DRIVER_POWER_STATE_FAILURE。Caused by driver: nvlddmkm.sys:这是最关键的信息,明确指出是由nvlddmkm.sys(NVIDIA显卡驱动程序)引起的。- 你可以据此去更新显卡驱动或联系NVIDIA官方。
- 打开
场景2:附加到一个正在运行的进程进行实时调试
假设你怀疑某个服务(如 w3wp.exe,IIS的工作进程)有内存泄漏或性能问题。
-
找到进程ID (PID): 打开任务管理器,找到
w3wp.exe进程,记下其PID(1234)。 -
附加调试器:
- 打开
WinDbg Preview(或CDB.exe命令行版本)。 - 在命令行输入以下命令并回车:
.attach 1234 - WinDbg 会附加到该进程,附加后,进程的执行会暂停。
- 打开
-
检查内存使用情况: 使用
!address命令查看进程的内存布局和使用情况。!address输出会非常详细,告诉你各种类型内存(堆、栈、映像等)的总使用量。
-
检查堆栈: 如果你想查看当前线程在做什么,可以使用
k(Stack Backtrace) 命令。k这会显示从当前执行点开始的函数调用链,帮助你定位代码执行到哪一步了。
-
分离调试器: 调试完成后,不要直接关闭WinDbg,这会导致被调试的进程终止,应该使用
Detach命令安全分离。.detach
场景3:分析内核模式崩溃
如果系统蓝屏,问题可能出在内核驱动程序中。
-
配置内核调试: 需要设置系统在下次重启时自动加载内核调试器,最简单的方式是通过注册表:
- 打开
regedit。 - 导航到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl。 - 创建一个名为
AutoReboot的DWORD值,并设置为0,这样蓝屏后就不会自动重启,给你时间查看错误信息。 - 确保
CrashDumpEnabled值为1。
- 打开
-
查看蓝屏信息: 系统蓝屏后,它会停留在蓝屏界面,并显示错误代码和停止信息,这些信息已经指明了大致方向。
-
使用 WinDbg 分析内存转储:
- 重启进入系统后,打开
WinDbg。 - 点击 "File" -> "Open Crash Dump...",选择
C:\Windows\memory.dmp。 - 同样,使用
!analyze -v命令进行深入分析,找到导致崩溃的驱动或模块。
- 重启进入系统后,打开
| 特性 | debug.exe (古老) |
Debugging Tools for Windows (现代) |
|---|---|---|
| 用途 | DOS程序调试、底层硬件/内存操作 | 现代Windows应用/内核调试、性能分析、故障排查 |
| 界面 | 纯命令行,极其简陋 | 图形化界面 (WinDbg) 和强大的命令行 (CDB/KD) |
| 功能 | 汇编、内存读写、端口操作 | 符号加载、堆栈分析、内存转储分析、断点、多线程调试 |
| 适用系统 | 16/32位 Windows | 32/64位 Windows |
| 学习曲线 | 陡峭,适合学习底层原理 | 较为平缓,功能强大但需要学习特定命令和符号 |
| 获取方式 | 系统自带(旧版) | 微软官网 下载 |
对于绝大多数用户和开发者来说,Debugging Tools for Windows 是必须掌握的工具。debug.exe 则更多是作为历史教学工具存在,希望这些实例能帮助你理解它们的使用方法!
