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时停下来 |