在我们平时写代码的时候,通常都是使用的debug
版本,debug
版本是可以进行调试的,它在形成可执行程序的时候,带有调试信息,能够方便我们更好地理解程序运行的情况和找出潜在的问题。
同时也因为带有调试功能,所以版本通常较大。
release
版本是最终发给用户的版本,这个版本会精简和优化代码,提高程序的性能。
因为这所面对的是用户层面,用户只需要使用就行,调试信息对于多数用户来说都是无用的,所以release
版本也不包含调试信息。
本篇将讲解Linux环境下的调试,之前有篇文字讲解过Windows环境下的调试:C语言——调试技巧,有兴趣可以点击查看。
而Linux中因为是纯指令,看不到是什么版本,这时候可以用gdb [可执行程序]
,查看当前程序是什么版本
显式没有调试信息,我们可以可以readelf -S [可执行程序] | grep -i debug
查看是否有调试信息
这里也没有看到有调试信息,这就说明,gcc/g++
默认编译是以release
版本发布的
如果需要已debug
方式发布,编译时需要加上-g
选项:
以debug
方式编译之后,就可以进入调试了。
进入gdb选项:gdb [可执行程序]
退出gdb选项:q
当进入gdb调试器之后,可以使用l [行号]
查看代码
gdb会自动记录上一次的指令,我们用了
l
选项之后,如果还想继续查看,直接回车即可
打断点可在调试时跳到断点处,进一步所需调试范围。
指令b [行号]
,就可以在指定的行号打上断点
这里也不像在VS中,打一个断点就会有小红点,这里打完断点,我们需要用指令info b
来查看当前我们所打的断点
从一个断点跳到另一个断点,指令c
即可,如果某处有问题,则跳不过来,就说明这个期间有问题,这样就能缩小调试范围
我们打的断点会按顺序从1开始编号,如果要删除断点,则删除他们对于编号即可d [编号]
同时,如果不想这个断点发货作用,同时也不想将这个断点删掉,就可以使用指令disable [编号]
使其失效,要打开就是enable [编号]
r
指令开始执行程序,如果有断点,就会运行的接触的第一个断点处停下,然后我们可以选择是逐过程n
还是逐语句s
往下执行
如果要在调试的过程中查看变量的变化或者是递增,使用指令p [目标]
,display [目标]
就能将监视的目标常显示
如果这里常显示,前面也是有编号的,如果不想常显示,undisplay [编号]
即可取消常显示
在调试时,如果进入了循环,发现问题并不在循环里面,可使用until [行数]
,跳出当前循环到达我们指定的地方
如果进入了函数,并且也发现当前函数没有问题,可使用until [行数]
跳出,也可以使用finish
跑完该函数
run(或 r):开始执行程序。
break(或 b):设置断点。可以指定断点的行号或函数名。
continue(或 c):继续执行程序直到下一个断点或程序结束。
next(或 n):执行下一行代码,但是不会进入函数调用。
step(或 s):执行下一行代码,并进入函数调用。
finish:执行当前函数的剩余部分,并返回到函数的调用点。
print(或 p):打印变量的值。可以使用表达式。
backtrace(或 bt):打印函数调用的堆栈跟踪。
info breakpoints(或 info b):列出当前设置的断点。
delete:删除指定的断点。
watch:设置观察点,当变量的值发生变化时暂停程序。
quit(或 q):退出GDB。
以上就是gdb的基本使用方法的,如果条件允许,我还是选择换在Windows环境调试。
那本期的分享就到这里咯,我们下期再见,如果还有下期的话。