【Linux】cgdb调试工具的使用
文章目录
- cgdb的使用
- debug vs release模式
- 调试
cgdb的使用
相比于vscode的调试,cgdb不吃性能,cgdb比gdb更好用,这让cgdb成为一个十分好用的调试工具,当然,也可以通过打印日志的方式进行调试,本文讲解cgdb的使用。
debug vs release模式
在使用vs时候,我们可以选择以release或者debug形式进行编译,使用release方式编译后的程序不能进行debug调试,与此同时编译器也会在release下进行一定的优化,比如inline展开、使用寄存器存储常用的数据、死代码优化等。debug模式下,编译器会在形成的可执行文件中添加debug信息,方便调试。
那么如何在Linux环境下使用gcc编译器以release/debug方式编译程序呢?
-
gcc -o myprocess myprocess.c -std=c99 -g
,其中-g
选项就是以debug
形式编译的意思。 -
gcc -o myprocess myprocess.c -std=c99
,默认就是以release
形式编译。
那么怎么查看你生成的可执行程序是可以正常debug的呢?
readelf -S my_debug | grep -i 'debug'
,使用readelf -S查看文件的二进制节(后面讲解文件的ELF格式会详细讲解这个命令,grep完成筛选),可以发现以debug
形式编译后的可执行文件有debug相应字段,这就说明可以正常调试了。
调试
-
cgdb 文件名
进入cgdb
模式 -
l <行数>
从所在行展开十行代码观看,不加行数默认从上次展开处再展开。 -
b
-
b <文件名>+ 行数
:在指定行打断点 -
info b
:查看断点信息(是否被禁用、是否有条件,条件是什么、断点编号是多少……) -
d + 断点编号
删除断点,d breakpoints
删除所有断点。 -
b <文件名> + 函数
:在指定函数入口打断点 -
if i=10
,if
参数放在b
后面,设置条件断点 -
disable 断点编号
禁用断点enable
开启
-
-
查看变量信息
p i
查看变量i
信息,p &i
查看i
的地址display i
常驻i
变量,undisplay 常驻编号
删除常驻
-
运行
r
:运行n
:逐过程s
:逐语句(单步进入函数)until + 行数
运行到指定行c
运行到下个断点处finish
完成当前函数后返回、停止bt
查看函数堆栈
-
info i
查看正在debug
的程序信息(哪个路径) -
info local
查看当前堆栈临时变量 -
watch i
变量i
被修改时有提示 -
set var flag = 1
更改指定变量值,验证方案是否正确