

gdb 常用命令#
run # 启动程序
shell断点 (Breakpoint)#
# 设置断点 (break / b)
b main # 在 main 函数入口设置断点
b *0x400ed0 # 在地址 0x400ed0 处设置断点
# 查看所有断点
info b
# 删除断点 (delete / d)
d # 删除所有断点
d 1 # 删除编号为 1 的断点
shell布局 (Layout)#
layout # 查看视图帮助
layout asm # 开启汇编视图
# 按 Ctrl + X + A 退出布局,再按一下恢复之前的布局。
shell执行 (Execution)#
si # 单步汇编指令,同 stepi
s # 单步代码,同 step
ni # 单步跳出汇编指令,同 nexti
n # 单步跳出代码,同 next
shell信息 (Information)#
info # 查看 info 指令的帮助
info r # 查看当前寄存器信息
info frame # 查看当前栈帧信息
info args # 查看当前栈帧的所有参数
shell检查 (Examination)#
x
命令可以查看内存。
格式:x/nfu address
指明查看的单位个数,默认为 1,可省略。
表示显示的格式:
- x:按十六进制显示
- s:按字符串显示
- c:按字符显示
- d:按照十进制
- o:按照八进制
- a:按照地址格式
- f:按浮点数格式显示
表示单位大小:
- b:byte
- h:halfword
- w:word
# Example
x/8xb $pc # 从 pc 所指向的地址开始,读取连续的 8 个字节值,然后用 16 进制展示出来。
x/s 0x400da0 # 从 0x400da0 地址开始,读取在该地址的字符串,并展示出来。
shell还有一种常见的用法:以指令为单位查看内存。
# Example
x/10i $pc # 从 pc 所指向的地址开始,读取连续 10 个汇编指令,然后展示出来。
shell打印表达式 (Print)#
使用 p 表达式
可以表达式的值。
# Example
print mai # mai 是变量名
print *(int *) $eax # 将 $eax 所指向的地址转换为 int *,再将其解引用,得到对应地址的一个 int 值。
shell反汇编 (Disassemble)#
# 使用 disas / disassemble 将对应代码反汇编
disas # 直接反汇编当前所在的函数
disas function_name # 指定函数进行反汇编
shell初始化文件#
在 gdb 启动时,gdb 会寻找 home 目录和当前目录下的 .gdbinit
文件,并执行里面的指令。
可以使用 -n
指示 gdb 忽略初始化文件。
指定脚本运行 gdb#
使用 -x
命令可以为 gdb 指定脚本,在进入 gdb 的时候自动执行该脚本里的命令。
# Example:指定脚本文件 script.gdb
gdb ./your_program -x script.gdb
shell其他#
为调试的程序指定 args#
在程序运行之前,使用 set args <参数1> <参数2> <...>
为程序指定参数。
# Example
set args -o main # 等价于 ./your_program -o main
set args < input.in # 将进程的标准输入重定向
shell