LZWcc's Blog

Back

GNU 的调试器 GDB 提供了许多有用的特性,支持机器级程序的运行时评估和分析。对于本书中的示例和练习,虽然可以通过阅读代码推断程序行为,但 GDB 能观察运行中的程序并控制其执行,使研究程序行为成为可能。

启动 GDB#

通常先运行 OBJDUMP 获取程序的反汇编版本。启动 GDB 的命令行格式如下:

Bash

linux> gdb prog
plaintext

核心调试策略#

  1. 设置断点(Breakpoints) :可在函数入口处或具体的程序地址处设置。
  2. 暂停与控制 :程序执行遇到断点时会暂停,并将控制权返回给用户。
  3. 检查状态 :在断点处可以查看寄存器和内存位置的内容。
  4. 单步跟踪 :可以执行单条指令,或前进到下一个断点。

GDB 常用命令参考表(机器级调试)#

下表总结了用于研究机器级 x86-64 程序的常用 GDB 命令。

分类命令效果
开始和停止quit退出 GDB
run运行程序(可在此处输入命令行参数)
kill停止当前正在运行的程序
断点break multstore在函数 multstore入口处设置断点
break *0x400540在地址 0x400540处设置断点
delete 1删除断点 1
delete删除所有断点
执行控制stepi执行 1 条指令
stepi 4执行 4 条指令
nexti类似于 stepi,但跳过函数调用(以函数为单位)
continue继续执行,直到遇到下一个断点
finish运行直到当前函数返回
检查代码disas反汇编当前函数
disas multstore反汇编函数 multstore
disas 0x400544反汇编位于地址 0x400544附近的函数
disas 0x400540, 0x40054d反汇编指定地址范围内的代码
print /x $rip以十六进制输出程序计数器 %rip的值
检查数据print $rax以十进制输出 %rax的内容
print /x $rax以十六进制输出 %rax的内容
print /t $rax以二进制输出 %rax的内容
print 0x100输出 0x100的十进制表示
print /x 555输出 555的十六进制表示
print /x ($rsp + 8)以十六进制输出 %rsp的内容加上 8 的结果
print *(long *) 0x7ffffffe818输出地址 0x7ffffffe818处的长整数
print *(long *)($rsp + 8)输出内存地址 %rsp + 8处的长整数
x/2g 0x7ffffffe818检查从地址开始的 2 个双字(8字节/字)内容
x/20b multstore检查函数 multstore的前 20 个字节
有用信息info frame显示有关当前栈帧的信息
info registers显示所有寄存器的当前值
help获取有关 GDB 命令的在线帮助

补充说明#

  • 语法提示 :GDB 的命令语法初看较为晦涩,建议多使用 help 命令查看详细用法。
  • 格式说明
  • /x: 十六进制
  • /d: 十进制
  • /t: 二进制
  • x 命令格式: x/Nuf addr(N-数量,u-单位大小,f-格式)。例如 x/2gg 代表 giant word(8 字节)。
  • 图形界面 :如果你不习惯命令行,可以使用 DDD (GDB 的图形化扩展)来观察数据结构和程序流。
使用 GDB 调试器
https://lzwcc.xyz/blog/csapp3_10_2/
Author LZWcc
Published at December 23, 2025
Comment seems to stuck. Try to refresh?✨