在图形化IDE工具中,常见 调试相关的功能项包括:
- /开始|停止|复位;
- step(能深入就深入函数,即进入函数)| step over(不深入函数)|step out(跳出当前函数)|run to cursor line(运行到光标指定位置)
- 插入|删除断点,使能|失能断点,失能全部断点,删除全部断点
- 查看局部变量|全局变量|静态变量,包括数组以及结构体变量.
- 查看指定地址的内存
集成化的工具能够做到这些,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 变量名称 | 修改变量值 |
断点相关命令:
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个字节.