1. 隐藏gdb进入时的版本信息 gdb -q
2. gdb输出信息较多时、gdb会暂停输出、打印提示信息、关掉提示、可以使用
set pagination off
或者 set height 0
3. info functions 查看所有的函数列表
4. info functions thread* 查看所有以thread开头的函数列表
5. n 执行下一句代码
s 进入自定义子函数
6. set step-mode on 让gdb进入库函数进行调试
7. 使用return或者finish 结束 子函数调试
finish 子函数会继续执行完毕、并且输出返回值、然后等待下边的命令
return 子函数不继续执行、直接返回
8. 可以使用 call 或者 print 直接调用函数执行
9. 打印函数堆栈信息 i(info) frame、使用frame n来选择函数堆栈、n是堆栈的层数
也可以使用frame addr来选择函数堆栈帧、addr是函数堆栈地址
10. 可以使用 i registers 查看寄存器内容、
11. disassmeble func查看汇编代码 disassemble {funcname}可以查看指定函数的汇编代码
12. debug entry-values 设置为非0值、可以在正常的函数堆栈信息外输出尾调用的信息
13. 可以使用up n或者down n来向下或者向上选择函数堆栈信息、其中n是层数
14. b(break) 可以设置断点
b Foo:foo 对namespace Foo中的foo函数设置断点、
b (anonymous namespace)::bar 对匿名空间的bar函数设置断点
b *0x400522 在指定地址设置断点
b linenum 在指定行设置断点
b file:linenum 指定文件第line行设置断点
15. save breakpoints file-name-to-save 保存断点
source file-name-to-save 恢复保存的断点
info breakpoints 查看断点信息
tb 可以使断点只执行一次(执行完成后删除)
16. 断点忽略
(gdb) b 10
Breakpoint 2 at 0x100000f4e: file 5.c, line 10.
(gdb) ignore 2 3
Will ignore next 3 crossings of breakpoint 2.
17. 打印输出
x/s &str 打印str的地址
p sizeof(str) 打印str的长度
打印大数组中的内容 p arr - 缺省打印200个元素
set print elements num - 重新设置打印元素的个数 num为0时、代表不做限制
p arr[index]@num 打印从index开始的num个元素
set print array-indexes on 打印数组下标
bt 打印调用堆栈信息
bt full 显示个函数的局部变量的值
bt full n 从内向外显示n个堆栈及局部变量
bt full -n 从外向内显示n个堆栈及局部变量
info locals 只打印局部变量
i files/ i target / i proc mapping 显示进程内存映射关系
p 'a.c'::var 打印a.c 中的静态变量var
ptype var 查看变量var的类型
i variables var 查看变量var定义的地方
x 打印内存的值
n 输出单元个数
f 输出格式
u 一个单元的长度
x/nfu 表示以f格式打印n个长度为u的单元
l(list) 打印源代码行
l - / l + 指定向前或者向后打印
l 1,10 打印指定范围的代码
set print pretty on - 设置以比较友好的方式打印复杂数据结构
x 会把最后检查的内存地址放在 $_ 变量中、把这个地址的内容放在 $__ 中
run 需要先设置断点、然后它会在断点处停止
start是从函数入口、一步步往下走
调试已运行的进程:
1. gdb -programe pid
2. 先进入gdb、然后 使用attach a pid
想结束调试的时候使用 detach
3. 调试子进程
在调试多进程时、gdb会默认追踪父进程、
set follow-fork-mode child 可以追踪子进程
set detach-on-fork off 可以同时调试父子进程、在调试一个进程的时候另一个进程挂起
4. i threads 查看所有的线程信息
5. i threads 1 打印线程1的信息
18. signal signame - 给程序发送信号
gdb调试学习
最新推荐文章于 2023-04-01 20:52:08 发布