要想使用gdb在编译文件的时候gcc必须加上-g -o标记,缺一不可!
GDB常用参数
gdb --tui 当然也可以进入gdb界面后使用TUI快捷键打开
layout 用以修改窗口布局 help layout
layout src
layout asm
layout split
layout reg
winheight 用以改变窗口高度 help winheight
winheight src +5
winheight src -4
focus next/prev 聚焦某个热点 help focus
在默认设置下,方向键和PageUp PageDn 都是用来控制gdbtui的src窗口的,所以,我们常用的上下键用来显示前一条命令和后一条命令的功能就没有了, 不过这个时候我们可以通过ctrl + n / ctrl +p 来获取这个功能。
我们还可以通过聚焦窗口的方式聚焦到某个窗口上,例如focus cmd命令聚焦到命令行上,这个时候我们就能通过方向键来切换上下条命令了
GDB常用的调试命令

(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h

(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r

(gdb)start:单步执行,运行程序,停在第一执行语句

(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l

(gdb)set:设置变量的值

(gdb)next:单步调试(逐过程,函数直接执行),简写n

(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s

(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt

(gdb)frame:切换函数的栈帧,简写f

(gdb)info:查看函数内部局部变量的数值,简写i

(gdb)finish:结束当前函数,返回到函数调用点

(gdb)continue:继续运行,简写c

(gdb)print:打印值及地址,简写p

(gdb)quit:退出gdb,简写q

(gdb)break+num:在第num行设置断点,简写b

(gdb)info breakpoints:查看当前设置的所有断点

(gdb)delete breakpoints num:删除第num个断点,简写d

(gdb)display:追踪查看具体变量值

(gdb)undisplay:取消追踪观察变量

(gdb)watch:被设置观察点的变量发生修改时,打印显示

(gdb)i watch:显示观察点

(gdb)enable breakpoints:启用断点

(gdb)disable breakpoints:禁用断点

(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元

(gdb)run argv[1] argv[2]:调试时命令行传参

(gdb) disassemble 查看汇编代码

(gdb) backtrace 简写(bt)当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用这条命令来查看当前的栈中的所有信息。
命令详情
print (p)查看参数或程序运行数据 可与以下参数结合
/x 按16进制格式输出变量
/d 按10进制显示变量
/u 按16进制格式显示无符号整型
/o 按8进制显示变量
/t 按2进制显示变量
/c 按字符格式显示变量
/f 按浮点格式显示变量
r e g e g : ( reg eg:( regeg:(eip) 查看寄存器的值

disassemble /m 显示方法名

backtrace -n 显示栈底下的几层信息
如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈 使用frame
frame n [栈帧] n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
up 表示向栈的上面移动n层,可以不打n,表示向上移动一层。
down 表示向栈的下面移动n层,可以不打n,表示向下移动一层。
提示:info f 会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内地址

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐