gdb
gdb(GNU debugger )是GNU开源组织发布的一个强大的Linux下的程序调试工具,它可以:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
- 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
- 当程序被停住时,可以检查此时你的程序中所发生的事
- 可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG
Debug与Release
gdb调试的是可执行文件的Debug版本,这里简单提一下Debug版本与Release版本
生成的可执行文件可以有Debug版本和Release版本,gcc默认生成的是Release版本
Debug版本:可调试的版本,它包含调试信息,并且不作任何优化,便于开发人员调试程序
Release版本:发行版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,它不可单步执行之类的
gcc默认生成的是Release版本,在编译时加上-g选项可以生成Debug版本
gcc -g 源文件.c -o 指定的文件名
-g选项与-o选项缺一不可,如果是分步完成编译链接,-g选项必须加到编译阶段
gdb的使用
1、使用gdb打开文件
gdb debug版本的可执行文件 #gdb后面跟的必须是debug版本的可执行文件,否则会报错
2、查看源码
list #list可以简写为l,用list默认查看main函数所在的代码
list 源代码文件 #查看指定文件的代码
list 源代码文件:行数 #查看指定文件指定行数周围10行的代码
list 文件名:函数名 #查看指定文件指定函数周围10行的代码
#命令一次只能显示十行,若想查看后面的源码可一直按回车键,直到所有源码显示完
断点管理
1、添加断点
b 行号 #将断点添加到最近一次显示的文件的指定行
b filename:行号 #将断点添加到filename的指定行
b functionname #将断点添加到指定函数的第一行
#b全称breakpoint
2、查看已有的断点的信息
info break #break可以简写为b
3、删除断点
d 断点号 #删除指定的断点
4、添加条件断点
这种断点是当满足一定条件时才会触发,比较适合进行异常排查
break line-or-function if (condition)
b src/main.cpp:127 if cnt==10
5、将断点设置为无效
将断点设置为无效并不会删除该断点,当需要时可以继续启用
disable [breakpoints] [range...] #disable可以简写为dis
breakpoints为断点号。 如果什么都不指定, 表示disable所有的停止点。 简写命令是dis
6、恢复断点
与disable对应的就是启用设置为无效的断点,即恢复断点
enable [breakpoints] [range...]
enable once [breakpoints] #仅仅恢复断点一次,当程序停止后, 该断点马上被GDB自动删除
执行流程控制
1、启动调试,开始执行
run #可以简写为r
2、单步执行
next #逐过程,简写为n 调用函数的语句中:n直接执行完函数继续执行
step #逐语句,简写为s s进入函数一句一句执行
finish #直接将当前函数执行完成,退出到调用函数的下一条指令的位置
3、继续执行,直到下一个断点
c
4、退出循环体
until #简写为u
5、退出调试
q
程序变量
查看变量的值
p valname
p &valname
p 数组名 #显示数组中所有元素的值
p 数组指针 #显示的是指针的值
执行一次p显示一次,如果不执行p,则不会显示
查看变量的类型
ptype valname
自动显示变量的值
display valname #每执行一次next或step,就显示一次
根据内存地址查看内存的存储值
x <addr> #<addr>表示一个内存地址
显示函数调用堆栈
bt #打印当前的函数调用栈的所有信息