gdb的学习及使用总结

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:执行程序

猜你喜欢

转载自blog.csdn.net/BaiFeng303/article/details/81838462