gdb调试总结
1、启动调试
进程未启动:gdb 进程名
进程已经启动:gdb attach 进程号
2、断点
2.1 在某一行设置断点:break 文件名 :行号
2.2 为函数设置断点:break 函数名
2.3 利用正则表达式设置断点:rb 正则表达式
2.4 条件断点:b xxx if yyy
2.5 临时断点:tb 断点
2.6 启用和禁用断点 enable 编号 / disable 编号
2.7 查看断点和删除断点: info b / delete 编号 / delete
3、查看
1、查看当前函数参数:info args
2、查看和修改变量的值: p 变量名 / print 变量名 = 值
3、查看结构体的值: p * 结构体指针 / p 结构体
4、查看数组:set print array + p 数组名
5、查看内存:x /s 字符串 x /4x &number x /16s xxx
打印内存的值 | 100个gdb小技巧 (gitbooks.io)
6、查看寄存器:info register
7、查看调用栈:bt / frame 编号 / info frame
4、多进程多线程调试
1、查看线程信息:info threads
2、切换线程:thread 线程ID
3、为线程设置断点:break 断点 thread 线程ID
4、为线程执行命令:thread apply 线程ID 命令 thread apply all bt (为所有线程执行命令)
5、只允许一个线程执行:set scheduler-locking on
6、调试子进程:set follow-fork-mode child
7、同时调试父子进程:set detach-on-fork off
在使用“set detach-on-fork off
”命令后,用“i inferiors
”(i
是info
命令缩写)查看进程状态,可以看到父子进程都在被gdb调试的状态,前面显示“*”是正在调试的进程。当父进程退出后,用“inferior infno
”切换到子进程去调试。