1、概述
GDB是一个由GNU开源组织UNIX/LINUX操作系统下的基于命令行的、功能强大的程序调试工具。
1.1、功能
GDB主要帮助完成下面4个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可以让被调试的程序在你所指定的位置的断点处停住。
3、当程序被停住时,可以检测此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其它BUG。
1.2、区别
主要是debug和release之间的区别。
因为release版本在编译期间缺少一些符号信息,会导致和debug版本有明显的区别:
1、inline、static函数在release版本中不能加断点;
2、release中不支持单步调试。
2、GDB的使用
2.1、整理思路
根据程序执行时的出错现象假设错误原因,然后在代码中找到适当的位置,构造错误现象触发的环境,进入gdb环境添加断点,执行程序并分析,通过程序执行过程以及变量的值确认错误原因。
2.2、进入
bash下查看进程号:提前理清错误出现在哪个进程中,是守护进程还是某个插件中,插件的代码都运行在对应的进程中。
如果是命令行还需要提前确认是哪个窗口,可以在触发错误的窗口执行来确认pid
通过gdb at xxx来启动调试
如果要断的是由这个进程触发的子进程,还需要set follow-fork-mode child
通过breakpoint XXX添加断点
之后continue,让其等待被触发
2.3、常用命令
1、breakpoint(简写b):添加断点,除了对函数添加断点外还可以对当前函数中的行号添加断点
2、continue(简写c):继续执行
3、printf(简写p):打印变量的值
3.1、set+变量+值:修改某个变量的值(p+变量+值 也可以修改)
4、enable breakpoints [num]:使能之前加过的断点,可以指定num,不指定就是对所有断点都使能。默认断点加入后就是使能状态
5、disable breakpoints [num]:去使能之前加过的断点
6、next(简写n):下一步(逐过程)
7、step(简写s):下一步(逐语句)
8、until:在for循环中可以使用,直接运行到循环结束
9、info break:查看断点信息
10、list:显示源代码,需要版本编译时 -g
10.1、list+函数名:可以用来显示某个函数在文件夹中的行号
11、watch:监视某块内存,当内存被改变时触发
12、bt:查看当前堆栈信息
13、finish(简写fin):执行到退出当前函数
14、quit或者ctrl+d退出
15、info threads:查看当前进程的线程都在忙啥
16、thread 线程id号:进入某个线程
17、b XXXX thread xxx :为某个线程设置断点函数(确认线程id:对进程加断点,当某个线程调度到后使用info threads,线程id前有*的就是当前线程)
18、打印结构体中的指针,可以将这个指针或地址强转为对应的结构体打印出来
19、info symbol 0xffff888812345678:可以用来看某个地址的栈信息,比如断言打出的堆栈信息
20、info registers:查看当前各寄存器信息
21、x /16x &g_stCgnStatistics:查看变量内存信息
22、set args:指定运行时的参数
23、show args:显示运行时的参数
24、detach:可以直接取消当前挂在的pid
25、attch+pid:不用退出直接再挂接其它进程,最好先detach上一个进程
26、run:执行程序