目录
编译可调试文件
-g
举例:
gcc -g xx.c
载入编译文件
gdb a.out
打断点
break/b 行号break/b 函数名执行在某个线程里打断点:break/b 56 thread 3
删除断点
delete用法:delete [breakpoints num] [range...]delete可删除单个断点,也可删除一个断点的集合,这个集合用连续的断点号来描述。例如:delete 5 (5代表行数)delete 1-10(1到10行的断点)clear用法:clear删除所在行的多有断点。clear locationclear 删除所选定的环境中所有的断点clear location location描述具体的断点。例如:clear list_insert //删除函数的所有断点clear list.c:list_delet //删除文件:函数的所有断点clear 12 //删除行号的所有断点clear list.c:12 //删除文件:行号的所有断点clear 删除断点是基于行的,不是把所有的断点都删除。
单步调试
n :执行下一行程序s :执行下一行程序,如果遇到函数 直接跳入函数,跳出该函数使用fin/return
重新运行调试
restart/r
查看info gdb信息
info registers :查看当前寄存器的值
info args :查有当前函数参教的值
info locals :查看当前局部变量的值
info frame :查看当前栈的详细信息
info variables :查看程序中的变量符号
info functionscsd : 查看程序中的函数符号
停止结束
quit/q
对正在执行的程序进行调试
以下三种方式皆可:1) gdb attach PID2) gdb 文件名 PID3) gdb -p PID结束方式:执行 detach 指令,使 GDB 调试器和程序分离;执行 quit(或 q)指令,退出 GDB 调试。
反汇编
disassemble/disass
当在oops里看到汇编指令偏移,如下图红色方框里的数值,其代表汇编指令偏移的数值,可以利用gdb的dissemble指令,看到反汇编,然后逐行找到编译个命令,定位到大概在函数的多少行。
![](https://img-blog.csdnimg.cn/e35012a7f85140619b8d55b246e2c912.png)
查看变量信息命令
print/p
display命令(自动显示命令)
和print 命令一样,display 命令也用于调试阶段查看某个变量或表达式的值,它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。
查看display的变量数:info display
![](https://img-blog.csdnimg.cn/3514ec33ed6c41ecb5505323b31fb0a8.png)
删除自动打印:undisplay num...
![](https://img-blog.csdnimg.cn/400f17b41fc940ed80572de9ff676ab4.png)
继续执行
C(continue),不能是r,r代表restart,从头开始执行
查看线程信息
info threads下图的*,表示当前在哪个上下文线程里
![](https://img-blog.csdnimg.cn/546ca949fce142fa8f4444a173bceda5.png)
查看所有线程调用栈thread apply all bt
gdb内执行shell指令
两种方式,shell command | !command.第一种是用内置指令shell.第二种是用特殊符号!开头.好处就是可以边调试边看源码,甚至进行一些其他操作.示例:!less a.cpp# 查看代码!pwd#查看进来时的工作目录c && !ping 192.168.1.155#测试发包结构
修改调试的变量值
print num = x
跳到指定行
jump number(行号)
注意:跳过的不执行
指定在某个文件打断点
b file.c:22
until(u) 执行一行程序
若此时程序是在 for/while/do loop 循环的最后一行,则一直执行到循环 结束后的第一行程序后停止在没有循环的地方,可以直接指定到多少行,u line如:u 53
examine(x)
打印内存地址值,格式如下:x/[ number][ format] < addr>其中number,format都是可选参数addr:为查看变量的内存地址number: 一个正整数,表示从当前地址向后显示几个地址的内容,如x/24 0x400c90表示查看0x400c90到向后0x400c90+24的内容format:显示的格式不是查看的格式。和c语言中的格式缩写一样,如d:整数integers:字符串stringc:字符charu:无符号整数 unsigned integero:八进制格式显示变量x:十六进制格式f: 浮点数格式float
加载符号表命令
symbol-file [符号表文件]
条件断点
watch expr if condbreak expr if cond
显示当前行号
info line
focus显示命令模式
![](https://img-blog.csdnimg.cn/dc4cd5952b3047afa7f41b4be26dffda.png)
注意:切换到 focuse模式后,箭头键被用来移动上方的代码窗口。如果需要在调试窗口切到历史命令,可以用ctrl+p previousctrl+n nextctrl+b backctrl+f forward(gdb) info winsrc (31 lines) <has focus>cmd (17 lines)(gdb) fs cmdFocus set to cmd window.(gdb) info winsrc (31 lines)cmd (17 lines) <has focus>此时,gdb focus在cmd window,箭头会作用于cmd window,想切换回 src window,输入fs src即可。关闭 : Ctrl+X+A
断点条件判断(字符比较)
b 4124 if strcmp(tn->str,"exit") == 0
commonds 命令
给断点附加一些 “自动化” 执行的命令,当程序运行到断点并停住时,就会自动执行这些预先设定好的命令, 达到“自动化调试”的目的。
commands <break_number>
> ...command_list...
> end
break_numer:是断点号
end: 结束commands 命令
举例: 遇到断点,自动打印调用栈
(gdb) b free(第一个断点,使用commands时,可以省略1断点号)
Breakpoint 1 at 0x7fba758d54 (3 locations)
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>bt
>c
>end
(gdb) b malloc(为第二个断点)
Breakpoint 2 at 0x7fba758774 (3 locations)(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>bt
>c
>end
(gdb) c删除: 清空断点的命令,输入commands num后,直接输入end即可(gdb)commands 1> end
查看变量的类型:(whatis)
(gdb) whatis i
type = u_int8_t
(gdb) whatis u_int8_t
type = __uint8_t
(gdb) whatis __uint8_t
type = unsigned char
查看函数传参参数
info/i args
gdb return finish
1.如果想要立即中断当前函数运行并返回,用return,当前函数的剩余语句将不被执行。(return可带参数,可以此随意设定当前函数的返回值)
2.如果想让程序执行到当前函数返回之后停止,用finish,当前函数的剩余语句将会正常运行。
gdb 进程传参
--args
例如:
gdb --args ./trdp-md-test caller
trdp-md-test:进程
caller :参数