一、gdb调试器背景
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
二、安装gdb
yum install gdb
三、使用gdb
在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。
我们可以使用readelf指令查看ELF格式的文件信息:
我们先写一个代码
使用gdb + file命令进入调试:
1. l指令(显示代码)
l 0从第一行开始输入
2. b指令(设置断点)
上面的意思是在21行设置一个断点
3. info b(显示断点)
4. disable num(禁用断点)
当Enb一栏为n是断点被禁用
5. enable num(启用断点)
6. d num(删除断点)
7. r指令(运行代码)
运行代码在断点处停下。
8. n指令(逐过程运行代码)
9. s指令(逐语句运行代码)
10. c指令(运行到下一个断点)
11. bt指令(查看函数调用堆栈)
12. finish指令(执行完当前函数)
13. p指令(临时查看变量)
14. display指令(监视)
15. undisplay(取消监视)
16. until指令(跳转)
17. set var指令(修改变量的值)
四、指令总览
【进入gdb】
指令: gdb 文件名【调试】
1)「run/r」:运行代码(启动调试)。
2)「next/n」:逐过程调试。
3)「step/s」:逐语句调试。
4)「until 行号」:跳转至指定行。
5)「finish」:执行完当前正在调用的函数后停下来(不能是主函数)。
6)「continue/c」:运行到下一个断点处。
7)「set var 变量=x」:修改变量的值为x。【显示】
1)「list/l n」:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示.。
2)「list/l 函数名」:显示该函数的源代码。
3)「print/p 变量」:打印变量的值。
4)「print/p &变量」:打印变量的地址。
5)「print/p 表达式」:打印表达式的值,通过表达式可以修改变量的值。
6)「display 变量」:将变量加入常显示(每次停下来都显示它的值)。
7)「display &变量」:将变量的地址加入常显示。
8)「undisplay 编号」:取消指定编号变量的常显示。
9)「bt」:查看各级函数调用及参数。
10)「info/i locals」:查看当前栈帧当中局部变量的值。【断点】
1)「break/b n」:在第n行设置断点。
2)「break/b 函数名」:在某函数体内第一行设置断点。
3)「info breakpoint/b」:查看已打断点信息。
4)「delete/d 编号」:删除指定编号的断点。
5)「disable 编号」:禁用指定编号的断点。
6)「enable 编号」:启用指定编号的断点。【退出gdb】
1)「quit/q」:退出gdb。