今天在刷leetcode时候,有一道题我写的代码逻辑出了问题.想着进行一下本地调试的,但是碍于我的开发环境–我是用的原生ArchLinux,然后使用neovim写代码,用原生的gcc/g++编译代码,这时候调试代码就变得麻烦起来了,需要使用命令行的gdb(其实也可以使用vscode,但是我喜欢编译编译分离这样的层状开发体验,而且我使用工具向来都是最简最轻量原则,所以只好复习一下gdb了),这篇博客就诞生了.
声明:这篇博客是为了满足我调试代码的需求,所以会基于我的开发环境
以debug模式编译代码
gcc/g++默认是以release模式编译的代码,release编译的代码我们是无法调试的,强行使用gdb调用会报错No debugging symbols found in a.out
.
要使用deubg编译代码,我们需要在编译选项中加上-g
选项.例如:
g++ main.cc -o a.out -g
.
查看gdb信息
我们使用的调试工具是gdb,这里我们首先要保证我们的gdb就绪了.在命令行中使用gdb --version
就可以查看gdb版本信息.
运行gdb和待调试文件
这里我常用的有两种途径,第一种是直接使用gdb选项,gdb a.out
.或者是先运行adb再指定文件,先使用gdb
命令,然后在gdb运行框中输入file a.out
,也能达到同样的效果.
阅读代码
在gdb运行框中可以使用l(list) number
来在gdb中查看代码信息.
有一个使用说明,这里的number行号并不是从哪一行列出代码,而是会把这一行置于中间.
断点管理和调试命令
- 新建断点:
b(break) number
,这里的number就是行号,意思就是在number行打一个断点,值得一提的是,后面查断点和删除断点本身并不参考这里的number,断点在管理中是由编号管理的而非行号. - 查看断点:
info b(break)
,这个命令可以查看断点编号,断点类型,断点启用状态,地址,所在函数,所在文件,所在行号. - 删除断点:
d(delete) number
,这里的number就是编号. - 启用/禁用断点:
enabledisable number
,这里number同样是断点编号. - 逐过程:
n(next)
. - 逐语句:
s(step)
. - 执行到下一个断点处:
c(continue)
. - 执行到当前函数返回:
finish
. - 执行到指定位置:
until number
,这里number为行号. - 查看变量值:
p val
. - 修改变量值:
set val
. - 跟踪变量:
display val
. - 栈帧局部变量的值:
info local
.
退出gdb
quit
或者ctrl+d.