主页
文章
分类
系列
标签
GDB
发布于: 2017-12-10   更新于: 2017-12-10   收录于: Tool , Cheat sheet
文章字数: 2510   阅读时间: 6 分钟  

帮助信息

1
2
3
4
5
6
7
help                       # 列出命令分类
help running               # 查看某个类别的帮助信息
help run                   # 查看命令 run 的帮助
help info                  # 列出查看程序运行状态相关的命令
help info line             # 列出具体的一个运行状态命令的帮助
help show                  # 列出 GDB 状态相关的命令
help show commands         # 列出 show 命令的帮助

启动 GDB

1
2
3
4
5
6
7
gdb                        # 正常启动,启动后需要 file 命令手动加载
gdb program                # 正常启动,加载可执行
gdb program core           # 对可执行 + core 文件进行调试
gdb program pid            # 使用 gdb 命令调试运行中的 program,需要指定 pid
gdb -p pid                 # 使用 gdb 命令调试运行中的 pid 号进程,gdb 会根据运行信息自动找到可执行程序位置
gdb attach pid             # 同上
gdb -tui                   # 启用 gdb 的文本界面(或 ctrl-x ctrl-a 更换 CLI/TUI)

断点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
break main                 # 对函数 main 设置一个断点,可简写为 b main
break 101                  # 对源代码的行号设置断点,可简写为 b 101
break basic.c:101          # 对源代码和行号设置断点
break basic.c:foo          # 对源代码和函数名设置断点
break *0x00400448          # 对内存地址 0x00400448 设置断点
info breakpoints           # 列出当前的所有断点信息,可简写为 info break
delete 1                   # 按编号删除一个断点
delete                     # 删除所有断点
clear                      # 删除在当前行的断点
clear function             # 删除函数断点
clear line                 # 删除行号断点
clear basic.c:101          # 删除文件名和行号的断点
clear basic.c:main         # 删除文件名和函数名的断点
clear *0x00400448          # 删除内存地址的断点
disable 2                  # 禁用某断点,但是不删除
enable 2                   # 允许某个之前被禁用的断点,让它生效
rbreak {regexpr}           # 匹配正则的函数前断点,如 ex_* 将断点 ex_ 开头的函数
tbreak function|line       # 临时断点
hbreak function|line       # 硬件断点
ignore {id} {count}        # 忽略某断点 N-1 次
condition {id} {expr}      # 条件断点,只有在条件生效时才发生
condition 2 i == 20        # 2 号断点只有在 i == 20 条件为真时才生效
watch {expr}               # 对变量设置监视点
info watchpoints           # 显示所有观察点
catch exec                 # 断点在 exec 事件,即子进程的入口地址

运行程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
run                        # 运行程序
run {args}                 # 以某参数运行程序
run < file                 # 以某文件为标准输入运行程序
run < <(cmd)               # 以某命令的输出作为标准输入运行程序
run <<< $(cmd)             # 以某命令的输出作为标准输入运行程序
set args {args} ...        # 设置运行的参数
show args                  # 显示当前的运行参数
cont                       # 继续运行,可简写为 c
step                       # 单步进入,碰到函数会进去
step {count}               # 单步多少次
next                       # 单步跳过,碰到函数不会进入
next {count}               # 单步多少次
CTRL+C                     # 发送 SIGINT 信号,中止当前运行的程序
attach {process-id}        # 链接上当前正在运行的进程,开始调试
detach                     # 断开进程链接
finish                     # 结束当前函数的运行
until                      # 持续执行直到代码行号大于当前行号(跳出循环)
until {line}               # 持续执行直到执行到某行
kill                       # 杀死当前运行的函数

栈帧

1
2
3
4
5
6
bt                         # 打印 backtrace 
frame                      # 显示当前运行的栈帧
up                         # 向上移动栈帧(向着 main 函数)
down                       # 向下移动栈帧(远离 main 函数)
info locals                # 打印帧内的相关变量
info args                  # 打印函数的参数

代码浏览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
list 101                   # 显示第 101 行周围 10 行代码
list 1,10                  # 显示 1 到 10 行代码
list main                  # 显示函数周围代码
list basic.c:main          # 显示另外一个源代码文件的函数周围代码
list -                     # 重复之前 10 行代码
list *0x22e4               # 显示特定地址的代码
cd dir                     # 切换当前目录
pwd                        # 显示当前目录
search {regexpr}           # 向前进行正则搜索
reverse-search {regexp}    # 向后进行正则搜索
dir {dirname}              # 增加源代码搜索路径
dir                        # 复位源代码搜索路径(清空)
show directories           # 显示源代码路径

浏览数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
print {expression}         # 打印表达式,并且增加到打印历史
print /x {expression}      # 十六进制输出,print 可以简写为 p
print array[i]@count       # 打印数组范围
print $                    # 打印之前的变量
print *$->next             # 打印 list
print $1                   # 输出打印历史里第一条
print ::gx                 # 将变量可视范围(scope)设置为全局
print 'basic.c'::gx        # 打印某源代码里的全局变量,(gdb 4.6)
print /x &main             # 打印函数地址
x *0x11223344              # 显示给定地址的内存数据
x /nfu {address}           # 打印内存数据,n 是多少个,f 是格式,u 是单位大小
x /10xb *0x11223344        # 按十六进制打印内存地址 0x11223344 处的十个字节
x/x &gx                    # 按十六进制打印变量 gx,x 和斜杆后参数可以连写
x/4wx &main                # 按十六进制打印位于 main 函数开头的四个 long 
x/gf &gd1                  # 打印 double 类型
help x                     # 查看关于 x 命令的帮助
info locals                # 打印本地局部变量
info functions {regexp}    # 打印函数名称
info variables {regexp}    # 打印全局变量名称
ptype name                 # 查看类型定义,比如 ptype FILE,查看 FILE 结构体定义
whatis {expression}        # 查看表达式的类型
set var = {expression}     # 变量赋值
display {expression}       # 在单步指令后查看某表达式的值
undisplay                  # 删除单步后对某些值的监控
info display               # 显示监视的表达式
show values                # 查看记录到打印历史中的变量的值 (gdb 4.0)
info history               # 查看打印历史的帮助 (gdb 3.5)

目标文件操作

1
2
3
4
5
file {object}              # 加载新的可执行文件供调试
file                       # 放弃可执行和符号表信息
symbol-file {object}       # 仅加载符号表
exec-file {object}         # 指定用于调试的可执行文件(非符号表)
core-file {core}           # 加载 core 用于分析

信号控制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
info signals               # 打印信号设置
handle {signo} {actions}   # 设置信号的调试行为
handle INT print           # 信号发生时打印信息
handle INT noprint         # 信号发生时不打印信息
handle INT stop            # 信号发生时中止被调试程序
handle INT nostop          # 信号发生时不中止被调试程序
handle INT pass            # 调试器接获信号,不让程序知道
handle INT nopass          # 调试器不接获信号
signal signo               # 继续并将信号转移给程序
signal 0                   # 继续但不把信号给程序

线程调试

1
2
3
4
5
6
7
8
9
info threads               # 查看当前线程和 id
thread {id}                # 切换当前调试线程为指定 id 的线程
break {line} thread all    # 所有线程在指定行号处设置断点
thread apply {id..} cmd    # 指定多个线程共同执行 gdb 命令
thread apply all cmd       # 所有线程共同执行 gdb 命令
set schedule-locking ?     # 调试一个线程时,其他线程是否执行,off|on|step
set non-stop on/off        # 调试一个线程时,其他线程是否运行
set pagination on/off      # 调试一个线程时,分页是否停止
set target-async on/off    # 同步或者异步调试,是否等待线程中止的信息

进程调试

1
2
3
4
5
info inferiors                       # 查看当前进程和 id
inferior {id}                        # 切换某个进程
kill inferior {id...}                # 杀死某个进程
set detach-on-fork on/off            # 设置当进程调用 fork 时 gdb 是否同时调试父子进程
set follow-fork-mode parent/child    # 设置当进程调用 fork 时是否进入子进程

汇编调试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
info registers             # 打印普通寄存器
info all-registers         # 打印所有寄存器
print/x $pc                # 打印单个寄存器
stepi                      # 指令级别单步进入,可以简写为 si
nexti                      # 指令级别单步跳过,可以简写为 ni
display/i $pc              # 监控寄存器(每条单步完以后会自动打印值)
x/x &gx                    # 十六进制打印变量
info line 22               # 打印行号为 22 的内存地址信息
info line *0x2c4e          # 打印给定内存地址对应的源代码和行号信息
disassemble {addr}         # 对地址进行反汇编,比如 disassemble 0x2c4e

历史信息

1
2
3
4
5
6
7
8
show commands              # 显示历史命令 (gdb 4.0)
info editing               # 显示历史命令 (gdb 3.5)
ESC-CTRL-J                 # 切换到 Vi 命令行编辑模式
set history expansion on   # 允许类 c-shell 的历史
break class::member        # 在类成员处设置断点
list class:member          # 显示类成员代码
ptype class                # 查看类包含的成员
print *this                # 查看 this 指针

其他命令

1
2
3
4
5
define command ... end     # 定义用户命令
<return>                   # 直接按回车执行上一条指令
shell {command} [args]     # 执行 shell 命令
source {file}              # 从文件加载 gdb 命令
quit                       # 退出 gdb

GDB 前端

References

Andy
Welcome to andy blog
目录
相关文章
Core Dump
Core Dump 设置 生成 core 默认是不会产生 core 文件的 1 ulimit -c unlimited # -c 指定 core 文件的大小,unlimited 表示不限制 core 文件
2017-12-21
Git
配置 1 2 3 git config --global "Your Name" git config --global "Email Address" git config --global credential.helper store #保存密码(每次要输密码/重复输密码) 初始化 1 git init 提交修改 1
2016-5-27
Git 服务器安装
安装 git 1 apt-get install git 创建 git 专用用户 创建用户 git (如果希望多个账户密码可以添加一个组,然后再创建不同的用户) 1
2016-5-26
Batch
什么是批处理 批处理(Batch),也称为批处理脚本,批处理就是对某对象进行批量的处理 批处理文件的扩展
2017-11-5
Bash
常用快捷键 默认使用 Emacs 键位 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 CTRL+A # 移动到行
2017-4-21
Go
安装 前往 官网 下载 go1.19.4.linux-amd64.tar.gz 1 2 3 tar -C /usr/local/ -xzf go1.19.4.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin go version 看到版本号代表 go 安装成功 编译器命令 1 2 3 4 5 6 7 8 9 10 11 12
2019-12-30
Redis
启动 Redis 1 2 3 4 redis-server /path/redis.conf # 指定配置文件启动 redis redis-cli # 开启 redis 客户端 systemctl restart redis.service # 重启 redis systemctl status redis # 检查 redis 运行状态 字符串 1 2
2019-12-24
C#
数据类型 类型 大小 举例 String 2 bytes/char s = “reference” bool 1 byte b = true char 2 bytes ch = ‘a’ byte 1 byte b = 0x78 short 2 bytes val = 70 int 4 bytes val = 700 long 8 bytes val
2019-7-13
Python
常规 Python 对大小写敏感 Python 的索引从 0 开始 Python 使用空白符(制表符或空格)来缩进代码,而不是使用花括号 帮助 获取主
2018-10-6
Nginx
Nginx 常用命令 官方文档 1 2 3 4 5 sudo nginx -t # 检测配置文件是否有错误 sudo systemctl status nginx # nginx 当前的运行状态 sudo systemctl reload nginx # 重新加
2018-2-12