GDB调试常用操作
**打断点:**①b 函数名在某个函数出打断点;②b 行号在某行打断点
查看断点: i b
删除断点: d 断点编号
查看断点后会有断点的Num号
(gdb) i b Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000001149 in f at test.c:3 2 breakpoint keep y 0x0000000000001160 in main at test.c:9 3 breakpoint keep y 0x000000000000117c in main at test.c:12
运行GDB程序: start程序会停在main 函数入口;run遇到断点时停止
停止后继续运行: c
继续运行、直到遇到下一个断点或程序结束时再停止
单步调试: n向下执行一行代码、不会进入函数体;s向下执行一行代码、会进入函数体;finish跳出函数体
finish会继续运行直到当前函数返回,并打印函数的返回值
**默认执行上条命令:**什么命令都不输入、直接敲回车、会默认执行上条命令
这条在单步调试时挺方便的
查看变量值: p 变量名打印变量值
查看变量类型: ptype 变量名打印变量类型
帮助文档: help
GDB调试高级操作
设置条件断点: b 10 if 条件
在第10行打一个断点,程序执行到第10行时。只有当条件满足,程序才会停下来
设置断点无效: disable 断点编号
设置断点生效: enable 断点编号
打印函数调用栈: bt
(gdb) bt #0 f () at test.c:3 #1 0x0000555555555172 in main () at test.c:10注意:调用栈信息记得反过来看!
栈是先进后出的,所以,此时的调用栈的意思是,先调用
main再调用f
切换栈帧: f 编号用于在不同的调用堆栈层级之间切换,查看对应层级的局部变量和代码上下文。
eg:
f 1(切换到编号为1的栈帧);f 0(切回栈顶)
查看寄存器的值: i r
文本用户界面: layout split用于同时显示 源代码 和 汇编代码。
快捷键:
Ctrl + X,然后按 A退出/进入 TUI 模式
Ctrl + X,然后按 O切换焦点,用于代码窗口和命令窗口
Ctrl + L刷新屏幕,解决花屏问题
查看内存: x /<n><f><u> <address>
n: 显示几个单元f: 显示格式 (x=十六进制, d=十进制, c=字符, i=汇编指令)u: 单元大小 (b=byte, h=halfword/2bytes, w=word/4bytes, g=giant/8bytes)
自动显示变量: display 变量名
设置之后,在每次程序暂停时,GDB会自动打印这个变量的值
取消自动显示变量: undisplay 编号