📝
notes
  • Initial page
  • 02_ds_algo
    • ds
      • Union Find
      • Binary Indexed Tree
      • Stack
      • String
      • Linked List
      • Segment Tree
      • Union Find
      • Union Find
      • Array
      • Tree
      • Hash Table
      • queue
    • algo
      • Backtracking
      • Sort
      • Binary Search
      • Depth First Search
      • Bit Manipulation
      • Dynamic Programming
      • Breadth First Search
      • Two Pointers
      • Math
      • Sliding Window
    • leetcode
      • List
      • 1. Two Sum
      • READEME
      • 2. Add Two Numbers
  • README
    • README
      • pointer
      • effective-cpp
      • roadmap
      • pimpl
      • smartptr
  • 03_cheatsheet
    • README
      • git
      • gdb
    • README
      • bash
      • Python 速查表中文版
    • README
      • vim
Powered by GitBook
On this page
  • 启动 GDB
  • 帮助信息
  • 断点
  • 运行程序
  • 栈帧
  • 代码浏览
  • 浏览数据
  • 目标文件操作
  • 信号控制
  • 线程调试
  • 进程调试
  • 汇编调试
  • 历史信息
  • 其他命令
  • GDB 前端
  • References

Was this helpful?

  1. 03_cheatsheet
  2. README

gdb

启动 GDB

gdb object                ## 正常启动,加载可执行
gdb object core           ## 对可执行 + core 文件进行调试
gdb object pid            ## 对正在执行的进程进行调试
gdb                       ## 正常启动,启动后需要 file 命令手动加载
gdb -tui                  ## 启用 gdb 的文本界面(或 ctrl-x ctrl-a 更换 CLI/TUI)

帮助信息

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

断点

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 事件,即子进程的入口地址

运行程序

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                      ## 杀死当前运行的函数

栈帧

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

代码浏览

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          ## 显示源代码路径

浏览数据

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)

目标文件操作

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

信号控制

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                  ## 继续但不把信号给程序

线程调试

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   ## 同步或者异步调试,是否等待线程中止的信息

进程调试

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

汇编调试

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

历史信息

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 指针

其他命令

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

GDB 前端

gdb-tui                   使用 gdb -tui 启动(或 ctrl-x ctrl-a 更换 CLI/TUI)
cgdb                      http://cgdb.github.io/
emacs                     http://gnu.org/software/emacs
gdbgui                    https://github.com/cs01/gdbgui

GDB 图形化前端评测        http://www.skywind.me/blog/archives/2036

References

PreviousgitNextREADME

Last updated 4 years ago

Was this helpful?

https://sourceware.org/gdb/current/onlinedocs/gdb/
https://kapeli.com/cheat_sheets/GDB.docset/Contents/Resources/Documents/index
http://www.yolinux.com/TUTORIALS/GDB-Commands.html
https://gist.github.com/rkubik/b96c23bd8ed58333de37f2b8cd052c30
http://security.cs.pub.ro/hexcellents/wiki/kb/toolset/gdb