目录
一、关于Linux调试器gdb
二、gdb的操作
1、quit
2、l
3、r
4、b+行号
info b
5、d+断点编号
6、n
7、p+[变量名]
8、s
9、bt
10、finish
11、display+[变量名]
12、until+行号
13、c
14、disable/enable+断点编号
首先,我们的gcc/g++默认形成的可执行程序是release的,所以没有办法直接进行调试
如果直接使用gcc/g++编译出来的可执行文件进行gdb,就会出现如下问题:
先gcc test.c -o test,形成可执行程序test
然后gdb test会出现如下提示:不是debug,无法调试
如果想变为debug,则gcc时后面加上-g选项,输入gcc test.c -o test -g即可
gcc时加上-g选项后,gdb [可执行程序]就能进入调试,准备工作就完成了
读取可执行程序的数据段格式readelf -S [可执行程序]
如果想找有关可执行程序的debug信息,和管道以及grep结合使用,即可观察到
gdb会记录最近一条命令,如果命令不变化,可以直接回车会自动执行最近一次输入的命令
quit是退出调试
进入gdb后,如果想退出输入quit即可
l是显示代码,是list的简写
如果想更清楚的看代码,l 0就表示从第一行开始显示代码
r是直接开始调试,如果没有设置断点,则直接运行结束
如果有断点,则在断点处停下来
b+行号可以给特定的行打断点,b是breakpoint的简写
info b是查看断点
继续添加断点并查看断点
d+断点编号是删除断点,d是delete的简写
断点编号即info查看断点时,最左边的Num
n是在调试中逐过程执行,是next的简写
从上图可以清楚看到打断点后,执行r,程序会在断点处17行停下来,接着一直执行n:逐过程,直到程序执行完毕
p+[变量名]是打印变量内容
在执行了第18行后,p rst就可以看到rst现在的值时15
s是调试中逐语句执行,s是step的简写
首先看一下这个代码,是有一个Add函数的
我们在17行打了断点,在执行到18行时,想进入这个Add函数,这时输入s即可进入:
然后即可继续n或s调试代码
bt是查看调用堆栈的
即栈顶是正所处的函数Add,栈底是main函数
finish是将当前函数跑完就停下来
当我们逐语句走到函数Add里了,想直接跑完这个Add函数,直接输入finish:
这时再bt调用堆栈,发现已经没有Add函数了
display+[变量名]是给这个变量名长显示
当我们正常调试时,什么变量都没有,这时我们想观察i的值,并且接下来每一次逐语句执行都显示i,则display i即可,如果还想看变量num,再displaynum即可
这时我们不想看num了,undisplay+[显示编号],例如num是编号2,则输入undisplay 2,就在接下来的调试中就不会长显示num了,只会显示i的值
until+行号是跳转到指定行
如果执行到循环里,想从循环跳出来,
例如我们在第9行执行while循环,想直接跳到12行,until 12即可
c是运行到下一个断点处就停下来,c是continue的简写
17行和19行都有一个断点,c可以直接从17行断点处到第19行断点处
disable/enable+断点编号是打开和关闭断点
关闭断点意思就是断点依然存在,但是不起任何作用
如上图可以清楚看到disable 1即关闭断点编号为1的断点后,在查看断电时End下面的y变为n,这时表示关闭断点
如果想再打开断点,就是enable+断点编号