GDB简单调试

最近在开始刷LeetCode,也开始在Linux上写代码,直接gcc编译,在调试的时候,需要用到gdb调试,所以在这里会不定期更新我学习到的gdb调试。

先编译成可执行文件

首先我们使用g++或者gcc编译成可执行文件,记得要加-g编译选项,表示生成调试信息,以便我们使用gdb调试。

开始调试

假设我们有一个 main.cpp文件,编译链接后生成了main这个可执行文件,进行调试:

gdb main

设置断点

开始调试后,我们可以设置断点:

break 23

这个表示对源文件的23行设置一个断点。以上两步设置完可以看到以下:

第一个框里面就是我们开始调试输入的命令,下面是生成的调试信息。第二个框里面就是我们输入的设置断点的命令了。

如果有多个源文件共同生成的,可以指定源文件的行数进行调试:

break main.cpp:23

其实,break也可以用b来简写。

使用:

info b

可以查看到设置的断点信息:

开始运行

现在我们来介绍设置完断点后,运行时候我们的调试规则,先看一下截图,是一个在调试的过程:

图可能看起来很不想继续看,相信我,我以前也是这种态度,但是请你继续看,因为自己输入的东西很少,几乎都是它生成的信息更多。我已经把我们写的命令用方框框起来了。

现在一个命令一个命令的解释。

run

顾名思义,就是开始执行程序,直到执行到断点停下来。 在图中我简写成了r即可.

step,next

这两个都是单步调试,不同在于,step是可以进入到执行的函数中间去调试,next是直接跳过这个函数的调试,直接到下一行。

list

从图中可以看到,在我调试到第16行的时候,再输入一个list,会输出以16行为中心的代码。没错,list就是展示我们调试信息附近的代码。

printf

在图中我也是简写成p,都是可以的。可以明确看到,我们可以使用

p 变量名

来打印一个变量值。图中nums[i]此时的值是3,int型,地址为0x607010

quit

简写为q,就是退出GDB调试。

finish

结束GDB调试。

总结

gdb 可执行文件
(gdb)start 表示开始调试
(gdb) n 表示执行下一步(不会进入函数)
(gdb) step 表示执行下一步(会进入函数)
(gdb) b Line 给第Line行设置断点
(gdb) b xx.cpp:Line 给xx文件第Line行设置断点
(gdb) quit 表示退出调试
(gdb) p 变量名 可以查看变量的值
(gdb) finish 表示直接执行到当前函数结束
(gdb) list 可以显示当前部分代码
(gdb) list Line 可以显示Line行附近
(gdb) info b 显示断点信息
(gdb) d num(显示信息中的断点编号) 删除指定断点
(gdb) c (continue) 跳到下一个断点
(gdb) ptype 变量名 查看变量类型
(gdb) set argv[i]=x 设置参数值
(gdb) display 变量 跟踪变量,看每一步的值
(gdb) info display 显示跟踪信息
(gdb) undisplay num(显示信息中的编号) 放弃跟踪值
(gdb) break Line if i==6 条件断点。在Line行设置断点,并运行到i=6时停下来
原文地址:https://www.cnblogs.com/love-jelly-pig/p/9750885.html