gdb基本命令
开始调试:
首先使用gcc命令完成源代码文件的编译
编译完成后,通过gdb命令 进入调试模式
【基本操作】
简写 | 全称 | 含义 |
---|---|---|
b 7 | break | 在第7行设断点 |
r | run | 运行程序 |
p i | 打印变量i | |
n | next | 单步执行 |
display i | 监控变量i(=n后p的执行效果) | |
undisplay | 取消监控 | |
回车 | 重复执行上一条命令 | |
kill | 杀死正在调试的程序 | |
c | continue | 继续运行您的程序 (在停止之后,比如在一个断点之后) |
info | information | 查看信息 |
set | 设置变量的值 set var=value | |
file | 指定源代码位置 | |
watch | 为当前表达式设置观察点 |
【断点操作】
-
b break 设置断点
-
info b 显示断点信息
可以看到此时Enb(enable)的值为 y -
disable 1(1为断点的Num值)将断点关闭
可以看到此时Enb(enable)的值为 n,且此时执行r(run)命令时,程序执行过程中没有中断,直接执行到了程序结束 -
dl +断点数字编号 删除断点
-
clear 删除所有断点
-
enable 1 将断点开启
此时执行程序过程中遇到Breakpoint后中断
【函数堆栈操作】
函数栈层向上:up
向下:down
fr (frame):显示当前所在层次
frame n/简写:fr n
移动到第n层,n为栈的层次,然后可以用其他命令(info)查看此级别的变量信息
backtrace:查看函数调用的顺序(函数调用栈的信息)
【watch 命令】
watch < expr>
为表达式(变量)expr设置一个观察点,一旦其数值有变化,程序立即停止运行
rwatch < expr>
当表达式expr被读时,程序立即停止运行
awatch < expr>
当表达式expr 的值 被读或被写时程序立即停止运行
info watchpoints
列出当前所设置的所有观察点
【参数操作】
set args (参数列表) 向调试的程序传递参数
info args 查看当前函数的参数名及其值
show args 显示程序实际收到的参数
【x(examine)命令】
查看指定地址的内存地址的值
语法:
x /<n/f/u> <addr>
n
是一个正整数, 表示显示内存的长度 ,也就是说从当前地址向后显示几个地址的内容。
f
表示显示的格式 ,参见上面。如果地址所指的是 字符串 ,那么格式可以是 s 。
u
表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes 。 u 参数可以用下面的字符来代替, b 表示单字节, h 表示双字节, w 表示四字节, g 表示八字节。当指定了字节长度后, GDB 会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
<addr>
表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令: x/3uh 0x54320 表示,从内存地址 0x54320读取内容, h表示以双字节为一个单位, 3表示三个单位, u表示按十六进制显示。
x命令帮助文档:
示例:
源代码
查看数组变量a:数组长度为5,即向后查看5个地址的内容,以十进制整数形式(d
),int数据类型以四个字节一个单位(w
) 因此命令为 x /5dw a
如果错误选择字节数(int数据类型存储时以四个字节为一个单位),会打印错误的值
如:此时选择双字节h
选择错误的数据类型也会打印错误的值,如将浮点型数组 f 用d打印
打印字符串时,会分别打印实际的值以及它的ASCII编码
如果打印的值是指针变量,用p命令只能查看指针指向的内存地址的第一个元素的值
但使用examine命令可以查看
【函数调用命令】
finish(fi):直接将函数剩余的部分执行完,并返回调用值
until :执行到当前所在的循环结束为止
until+命令行号: 运行到某行代码为止
info locals :显示函数内的局部变量信息
kill:杀死当前正在运行的进程