菜鸟科技网

如何用cmd的debug命令进行调试?

debug 是一个非常古老但功能强大的底层调试工具,主要用于:

如何用cmd的debug命令进行调试?-图1
(图片来源网络,侵删)
  • 汇编语言编程:直接编写、汇编和链接机器码程序。
  • 内存检查和修改:直接读写和修改内存中的任何位置。
  • 磁盘扇区操作:直接读取、写入、甚至格式化磁盘的物理扇区。
  • 程序调试:单步执行程序,设置断点,检查寄存器和标志位状态。

重要提示debug 命令是一个过时的工具,在现代 Windows 系统(如 Windows 10, 11)中,它可能没有被默认安装,或者其功能受到严格限制(尤其是在 64 位系统上),对于现代软件开发,强烈推荐使用专业的集成开发环境 和更现代的调试器,如 Visual Studio Debugger 或 WinDbg。


如何启动 Debug

  1. 打开命令提示符 (CMD)

    • Win + R 键,输入 cmd,然后按回车。
  2. 启动 Debug

    • 直接在 CMD 中输入 debug 并回车。
      debug
    • 如果系统提示 'debug' 不是内部或外部命令,也不是可运行的程序或批处理文件,说明你的系统没有安装它,你可以尝试从 Windows 安装介质或网络上寻找 debug.com 文件,并将其放到系统路径(如 C:\Windows\System32)下。
  3. 进入 Debug 环境

    如何用cmd的debug命令进行调试?-图2
    (图片来源网络,侵删)
    • 成功启动后,你会看到一个短横线 作为提示符,这表示你已进入 debug 的交互模式。

Debug 的核心组成部分

debug 主要由两部分组成:命令寄存器

寄存器

debug 会直接显示和操作 CPU 的寄存器,在 提示符下输入 r 并回车,即可查看所有寄存器的当前值。

-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13A0  ES=13A0  SS=13A0  CS=13A0  IP=0100   NV UP EI PL NZ NA PO NC
13A0:0100 C7C6050000    MOV    WORD PTR [BX+SI+05],0000   ; 这是 CS:IP 指向的指令
  • 通用寄存器: AX, BX, CX, DX, SP, BP, SI, DI
  • 段寄存器: CS (代码段), DS (数据段), SS (堆栈段), ES (附加段)
  • 指令指针: IP (指向下一条要执行的指令)
  • 标志位: NV UP EI PL NZ NA PO NC (代表各种状态标志)

命令

debug 的命令通常是一个字母,后面可以跟参数,所有命令都用回车键执行。


常用 Debug 命令详解

以下是一些最常用和最重要的 debug 命令。

如何用cmd的debug命令进行调试?-图3
(图片来源网络,侵删)

内存和寄存器操作

命令 格式 描述 示例
R r [register] 显示或修改寄存器。 r ax (修改 AX 寄存器)
D d [address] Dump,显示内存内容(十六进制和 ASCII)。 d 100 (从地址 100 开始显示)
E e address [list] Enter,修改内存内容。 e 100 41 42 43 (将 41, 42, 43 写入地址 100, 101, 102)
F f range list Fill,用指定值填充一块内存区域。 f 100 10f ff (将地址 100 到 10f 填充为 FF)
A a [address] Assemble,进入汇编模式,输入汇编指令,自动生成机器码。 a 100 (在地址 100 处开始汇编)
U u [address] Unassemble,将机器码反汇编为汇编语言。 u 100 (从地址 100 开始反汇编)

程序执行与调试

命令 格式 描述
G g [=address] [addresses...] Go,从当前地址开始执行程序,直到结束或遇到断点。
T t [=address] [n] Trace,单步执行一条指令。n 可指定执行的指令数。
P p [=address] [n] Proceed,单步执行,但会完整执行子程序或循环指令,而不是进入其内部。
N n filename Name,为待加载的程序指定文件名,用于后续的 LW 命令。
L l [address] [drive] [sector] [n] Load,从磁盘加载一个文件到内存。
W w [address] [drive] [sector] [n] Write,将内存中的内容写入磁盘文件。⚠️ 警告:会破坏数据!

实战示例:编写并运行一个简单的汇编程序

假设我们要在屏幕上打印 "Hello!" 并退出。

步骤 1: 进入 Debug

debug

步骤 2: 使用 A 命令编写汇编代码

输入 a 100 开始在地址 CS:0100 处汇编。

-a 100
13A0:0100 mov ah,09       ; DOS 功能号 09 (显示字符串)
13A0:0102 mov dx,109      ; 字符串的地址
13A0:0105 int 21h         ; 调用 DOS 中断
13A0:0107 mov ah,4Ch      ; DOS 功能号 4Ch (程序结束)
13A0:0109 int 21h         ; 调用 DOS 中断
13A0:010B

按回车键返回 提示符。

步骤 3: 使用 E 命令写入字符串

我们需要在数据段(DS)中定义要打印的字符串,字符串必须以 我们先查看 DS 的值,然后使用 e 命令。

-r ds
DS 13A0
-e ds:109 "Hello!$"  ; 在 DS:0109 地址写入 "Hello!$",$ 是字符串结束符

注意DS 的值可能和你的不一样,使用你自己的 DS 值。

步骤 4: 查看代码和内存

使用 u 命令确认代码正确,用 d 命令确认字符串已写入。

-u 100 10b
13A0:0100 B409           MOV AH,09
13A0:0102 BA0901         MOV DX,0109
13A0:0105 CD21           INT 21
13A0:0107 B44C           MOV AH,4C
13A0:0109 CD21           INT 21
-d ds:109
13A0:0109  48 65 6C 6C 6F 21 24-4C 6F 61 64 20 4D 6F 64 75  Hello!Load Modu

看起来一切正常。

步骤 5: 使用 G 命令运行程序

g=100

程序执行后,你应该能在命令行窗口看到 "Hello!" 的输出。

步骤 6: 退出 Debug

-q

重要警告与总结

  1. 危险性debug 是一个无保护的工具。W 命令可以直接写入磁盘的任何扇区,这可能会永久破坏你的硬盘数据或操作系统文件,请务必谨慎使用,尤其是在进行写入操作时。
  2. 时代背景debug 是为 DOS 和早期 Windows 16 位环境设计的,在 32/64 位的现代 Windows 中,它无法直接访问物理内存或硬件,其功能被大大削弱。
  3. 学习价值:尽管已过时,但学习 debug 对于理解计算机底层工作原理(如 CPU、内存、中断、汇编语言)仍然有巨大的帮助。

如果你需要进行现代 Windows 程序的调试,请务必使用专业的工具,如 Visual StudioWinDbg

分享:
扫描分享到社交APP
上一篇
下一篇