背景知识
我们在widow下通过使用vs系列编译器进行调试都是在可执行程序的debug版本下进行的,release版本下是不支持进行调试的,Linux操作系统下也是如此的,只有在debug版本下才支持通过编译器进行调试代码。
将gcc默认进行编译的C语言程序进行调试,报错:no debugging symbols found,翻译成中文--没有发现degub的格式。也就是说gcc/g++默认情况下进行编译的可执行程序都是动态链接形成的release版本。说到这里我们还知道我们之前学习过的工具vim的默认行为是命令模式。
改变gcc/g++编译版本
通过上面的认识将gcc编译模式进行手动显示声明 ,通过-g选项进行声明将将要编译的.c文件行成的是debug的可执行程序。
然后进行gdb调试即可
gdb调试的操作
进入调试界面
gdb +可执行文件名
退出调试
quit或者简写 q
进行显示源码
list或者简写l l 0
一次显示十行通过回车建继续向下显示(十行)
进行调试
run或者简写r ,如果没有断点,直接将代码进行执行完毕
打断点
break或者简写b #b+行号进行在相应行进行打断点
查看断点信息
info b #进行查看断点信息
删除断点
d 断点编号 #进行删除断点
注意这里进行删除断点是通过断点编号进行的,并不是通过行号
逐语句进行调试
s 逐语句进行调试,相当于vs编译器下进行调试的F11
逐过程进行调试
n 逐过程进行调试,相当于vs编译器下进行调试的F10
逐过程和逐语句进行调试的区别:在main函数中没有调用函数时,逐语句进行调试和逐过程进行调试灭有任何区别,当main函数中存在被调用的函数时,逐语句进行调试时会进入到函数内部进行逐条语句的执行,逐过程是直接将函数当作语句进行执行,不在进入函数内部进行逐条语句的执行。
进行打印成员变量的值
p+成员变量名称
查看调用堆栈
bit
跑完当前函数
finish
这条命令和在主函数进行函数调用时通过逐过程进行跑完调用函数的这个指令差不多,只不过finish指定使用在已经进入被调用函数内部进行跑完函数的情况。
设置长显示
disply+变量名称
这里的长显示就相当于vs编译器下的监视,执行每一步语句或者每一个过程语句能够观察到变量的实时变化
跳转到指定行
until + 行号
跳转到下一个断点处
c
进行跳转到指定航一般都通过进行打断点的形式进行跳转,不建议通过until进行跳转
使能断点
disable/enable+断点编号
使断点失效/重新生效,disable并不是取消断点,而是将断点进行隐藏,但是断点的这个断点还是存在的,enable将失效的断点重新激活,使断点重新生效。