linux gdb 常用调试命令记录

在图形化IDE工具中,常见 调试相关的功能项包括:

  1. /开始|停止|复位;
  2. step(能深入就深入函数,即进入函数)| step over(不深入函数)|step out(跳出当前函数)|run to cursor line(运行到光标指定位置)
  3. 插入|删除断点,使能|失能断点,失能全部断点,删除全部断点
  4. 查看局部变量|全局变量|静态变量,包括数组以及结构体变量.
  5. 查看指定地址的内存

集成化的工具能够做到这些,gdb只多不少.
以此为目的,对号入座gdb指令.

常用指令:

开始|停止|复位

命令 描述 其他
s(start) 开始执行程序,并main函数的停在第一条语句处。
r(run) 连续执行程序,直到遇到断点
c(continue) 继续执行程序,直到下个断点
ctrl+c 停止,,,毕竟运行时没办法输入命令

复位动作,gdb貌似没办法支持…

单步动作:

step(能深入就深入函数,即进入函数)|
step over(不深入函数)|
step out(跳出当前函数)|
run to cursor line(运行到光标指定位置)
常用的,掌握这些就好.

命令 描述 其他
s(step) 执行下一行语句,如果有函数调用则进入到函数中
n(next) 执行下一行语句,不主动进入函数
finish 一直执行到当前函数返回,即跳出当前函数,执行其调用函数

run to cursor line(运行到光标指定位置):该功能相当于设置了断点.

断点管理:

命令 描述 其他
b(break) n n行设置断点
b 函数名 函数设置断点
****if 条件 if表示设置条件断点,只有条件为真时,才中断,结合其他断点设置语法使用.eg:b 10 if i==99,,,,即10行的断点,如果变量i==99,才生效
i(info) breakpoints 查所有的断点
delete breakpoints n 删除n号断点,其中n为断点的序列号,可以用info breakpoints查看
disable breakpoints n 失能n号断点
enable breakpoints n 使能n号断点
p 变量 查看变量值

变量查看

命令 描述 其他
i(info) 变量名 查看一个变量的值
i locals 查看所有局部变量的值
set var 变量名=变量值 修改变量值
p(print) 表达式 p 变量名=变量值,修改变量值
p 变量 查看变量值
display 变量名 使得程序每次停下来都会显示变量的值
bt(backtrace) 查看函数调用栈
frame n n为栈的层次,然后可以用其他命令(info)查看此级别的变量信息

内存查看

命令 描述 其他
x/nfu 查看从变量名开始的n个字节,例x/7bx input 表示查看从变量input开始的7个内存单元的内容

说明
x 是 examine 的缩写

n表示要显示的内存单元的个数

f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)

观察点管理:

断点是程序执行到某行代码是触发,观察点是程序访问某个内存单元时触发

命令 描述 其他
watch 变量名 当程序访问变量名指定的内存单元时,停止程序
info watchpoints 查看
delete watchpoints 删除

系统性的认知:

基本命令:

命令 描述 其他
backtrace(或bt) 查看各级函数调用及参数
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l) 列出源代码,接着上次的位置往下列,每次列10行
list 行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q) 退出gdb调试环境
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,如果有函数调用则进入到函数中
wath 观察一个变量
current 跳转到下个断点,或则跳转到观察点
quit 退出gdb调试
set var 变量名称 修改变量值

参考:linux之gdb基本调试命令和使用总结

断点相关命令:

break,可缩写为b

命令 描述 其他
增加断点
break 行号 源文件的某一行设置断点
break 函数名 一个特定的函数设置断点
break 行号 if 条件 设置条件断点
break 文件:行号 指定文件的某一行设置断点
break 文件:函数 指定文件的某个函数设置断点
删除断点
delete breakpoints n 根据指定的断点号删除某个断点,,, n为断点号
delete breakpoints 删除所有的断点
disable break n 禁用某个断点 n为断点号
enable break n 使能某个断点 n为断点号
查看断点
info break 查看当前已经设置的断点
保存断点 下一次调试时,可以”gdb hello2 -x 断点保存文件 “带断点信息调试,如此,就可以 info b 看到断点信息了
save breakpoint 文件 保存断点信息到文件

查看变量:

在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:

命令 描述 其他
查看变量
print 变量 查看指定变量的值
ptype 变量 查看指定变量的类型
print ‘文件’::变量 查看可能与局部变量重名的全局变量
print ‘函数’::变量 查看可能与局部变量重名的全局变量
print 内存起始地址@len 查看一段连续的len字节的内存空间值
print/格式 变量 按指定的格式显示:x 按十六进制格式显示变量;d 按十进制格式显示变量;u 按十六进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。c 按字符格式显示变量。f 按浮点数格式显示变量
examine(可缩写为x)/参数 查看内存地址中的值,参数:显示多少个块?什么格式?每块多少字节?,,,,, x/3uh 0x54320
display 变量 自动显示变量,当程序停止时.
undisplay 删除自动显示
delete display 删除自动显示
info display 查看当前的自动显示内容
info registers 查看寄存器的情况。(除了浮点寄存器)
info all-registers 查看所有寄存器的情况。(包括浮点寄存器)

可知:

查看数组:print 数组名称,
查看结构体:
print 结构体变量
print 结构体变量地址&100,即取某地址后的100个字节.

参见:
GDB查看运行时数据
【GDB调试学习笔记】GDB查看运行时数据

猜你喜欢

转载自blog.csdn.net/guozhongwei1/article/details/82156000