Linux调试器gdb

目录

一、关于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+断点编号


一、关于Linux调试器gdb

首先,我们的gcc/g++默认形成的可执行程序是release的,所以没有办法直接进行调试

如果直接使用gcc/g++编译出来的可执行文件进行gdb,就会出现如下问题:

先gcc test.c -o test,形成可执行程序test

Linux调试器gdb_第1张图片

然后gdb test会出现如下提示:不是debug,无法调试

Linux调试器gdb_第2张图片

如果想变为debug,则gcc时后面加上-g选项,输入gcc test.c -o test -g即可

Linux调试器gdb_第3张图片

gcc时加上-g选项后,gdb [可执行程序]就能进入调试,准备工作就完成了

Linux调试器gdb_第4张图片


读取可执行程序的数据段格式readelf -S [可执行程序]

Linux调试器gdb_第5张图片

如果想找有关可执行程序的debug信息,和管道以及grep结合使用,即可观察到

Linux调试器gdb_第6张图片


二、gdb的操作

gdb会记录最近一条命令,如果命令不变化,可以直接回车会自动执行最近一次输入的命令

1、quit

quit是退出调试

进入gdb后,如果想退出输入quit即可

Linux调试器gdb_第7张图片


2、l

l是显示代码,是list的简写

Linux调试器gdb_第8张图片

如果想更清楚的看代码,l 0就表示从第一行开始显示代码

Linux调试器gdb_第9张图片


3、r

r是直接开始调试,如果没有设置断点,则直接运行结束

如果有断点,则在断点处停下来


4、b+行号

b+行号可以给特定的行打断点,b是breakpoint的简写

info b

info b是查看断点

继续添加断点并查看断点

Linux调试器gdb_第10张图片


5、d+断点编号

d+断点编号是删除断点,d是delete的简写

断点编号即info查看断点时,最左边的Num

Linux调试器gdb_第11张图片


6、n

n是在调试中逐过程执行,是next的简写

Linux调试器gdb_第12张图片

从上图可以清楚看到打断点后,执行r,程序会在断点处17行停下来,接着一直执行n:逐过程,直到程序执行完毕


7、p+[变量名]

p+[变量名]是打印变量内容

Linux调试器gdb_第13张图片

在执行了第18行后,p rst就可以看到rst现在的值时15


8、s

s是调试中逐语句执行,s是step的简写

首先看一下这个代码,是有一个Add函数的

Linux调试器gdb_第14张图片

我们在17行打了断点,在执行到18行时,想进入这个Add函数,这时输入s即可进入:

Linux调试器gdb_第15张图片

然后即可继续n或s调试代码

Linux调试器gdb_第16张图片


9、bt

bt是查看调用堆栈的

即栈顶是正所处的函数Add,栈底是main函数

Linux调试器gdb_第17张图片


10、finish

finish是将当前函数跑完就停下来

当我们逐语句走到函数Add里了,想直接跑完这个Add函数,直接输入finish:

Linux调试器gdb_第18张图片

这时再bt调用堆栈,发现已经没有Add函数了


11、display+[变量名]

display+[变量名]是给这个变量名长显示

当我们正常调试时,什么变量都没有,这时我们想观察i的值,并且接下来每一次逐语句执行都显示i,则display i即可,如果还想看变量num,再displaynum即可

Linux调试器gdb_第19张图片

这时我们不想看num了,undisplay+[显示编号],例如num是编号2,则输入undisplay 2,就在接下来的调试中就不会长显示num了,只会显示i的值

Linux调试器gdb_第20张图片


12、until+行号

until+行号是跳转到指定行

 如果执行到循环里,想从循环跳出来,

Linux调试器gdb_第21张图片

例如我们在第9行执行while循环,想直接跳到12行,until 12即可

Linux调试器gdb_第22张图片


13、c

c是运行到下一个断点处就停下来,c是continue的简写

17行和19行都有一个断点,c可以直接从17行断点处到第19行断点处

Linux调试器gdb_第23张图片


14、disable/enable+断点编号

 disable/enable+断点编号是打开和关闭断点

关闭断点意思就是断点依然存在,但是不起任何作用

Linux调试器gdb_第24张图片

如上图可以清楚看到disable 1即关闭断点编号为1的断点后,在查看断电时End下面的y变为n,这时表示关闭断点

如果想再打开断点,就是enable+断点编号

Linux调试器gdb_第25张图片

你可能感兴趣的:(Linux,linux,运维,服务器)