📝前言:
这篇文章我们来讲讲Linux调试工具——gdb/cgdb:
🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏
目录
- 一,debug 和 release
- 二,什么是gdb/cgdb
- 三,gdb命令
- 1. 调试的文件要求
- 2,常见指令
- 2.1 进入和退出
- gdb 和 quit
- 2.2 显示源代码
- list
- 2.3 断点 break
- 设置断点
- 删除断点
- 断点的使能
- 2.4 执行
- run 和 continue
- next 和 step
- finish
- until
- 2.5 打印,查看信息
- display 和 undisplay
- info
- backtrace
- watch
- 2.6 修改变量
- set var
- 三,cgdb的特别命令
一,debug 和 release
- debug 版本:开发期间使用的,用于调试,发现问题
- release版本:产品发布的版本,以及测试用的版本
二,什么是gdb/cgdb
gdb就是一个强大的调试工具,cgdb 结合了gdb的功能和类似Vim的文本界面,为用户提供更好的调试体验。
三,gdb命令
1. 调试的文件要求
gdb 用于调试程序的debug版本
语法:gdb + 文件名(可执行程序)
注意:
Linux下,gcc编译的文件默认是release版本,如果需要编译成debug版本,需要使用-g
选项
如:
不使用-g
是产生的是release版本,使用-g
后才是debug版本
补充:gcc编译时要指定语法版本(如c99):-std=c99
2,常见指令
2.1 进入和退出
gdb 和 quit
- 进入:
gdb + 文件名(可执行程序)
- 退出:
quit
2.2 显示源代码
list
命令:list
,别名l
作用:显示源代码
list 5
:从上次位置开始,列出行号为5
附近的 10 行源代码list main
:列出指定函数的源代码list code.c(源文件):1
:查看源文件code.c
第一行附近的源代码
示例:
2.3 断点 break
设置断点
命令:break
,别名:b
,断点也用符号b
表示
作用:设置断点
b 10
:在第10行设置断点b test.c:10
:在源文件test.c
的第10行设置断点b main
:在main
函数的入口设置断点b 10 if condition
:在第10行设置条件断点。条件断点即:当满足condition
条件的时候断点才被使能conditon + 断点编号 + 条件内容(不用前跟if)
:给已经存在的断点设置条件
断点建立好以后是有编号的,后续对断点进行各种操作都是基于断点编号。在一次调试过程中编号的顺序不会重置。
示例:
标红了为设置了断点的地方
删除断点
命令:delete
,别名d
作用:删除断点
d break
:删除所有断点d 1
:删除编号为 1 的断点
示例:
断点的使能
使能就是:不禁用,起作用
一个端点,当我们不需要时,不一定非要删除,还可以选择禁用它
disable b
:禁用所有断点disable 1
:禁用编号为 1 的断点enable b
:启用所有断点enable 1
:启用编号为 1 的断点
示例:
2.4 执行
run 和 continue
run:
命令:run
,别名:r
作用:运行程序,到断点位置停止。或者,重新开始调试
continue:
命令:continue
,别名:c
作用:继续运行程序,直到程序结束,或遇到下一个断点,或遇到错误
示例:
run
和c
:
变化:
从第16行断点的位置直接到下一个断点(第5行):
next 和 step
next:
命令next
,别名:n
作用:单行执行,不会进入函数,把函数当一行代码直接执行完
step:
命令:step
,别名:s
作用:单步执行,会进入函数内部
按回车键,会重复上一个命令
示例:
finish
命令;finish
,别名fin
作用:若此时在函数内部,直接执行到函数返回
示例:
until
命令:until
,别名u
作用:直接执行到指定行号
until 20
:直接执行到第20行
示例:
2.5 打印,查看信息
命令:print
,别名:p
作用:打印变量 / 表达式的值
print start+end
:打印start+end
的值p x
:打印x
的值
示例:
作用域规则:在 C 语言里,变量的作用域决定了它在程序里的可见范围。变量 a
是在 main
函数中定义的局部变量。而当前调试位置处于 sum
函数内部,sum
函数和 main
函数是不同的作用域。根据 C 语言的作用域规则,sum
函数无法直接访问 main
函数里定义的局部变量,所以 GDB 在当前的 sum
函数调试上下文中找不到变量 a
display 和 undisplay
命令:display
和 undisplay
,别名:disp
和undisp
display x
:跟踪显示指定变量的值(每次停止时,指到下一个断点处,或者单步执行,按回车不行)undisplay 1
:取消对指定编号的变量的跟踪显示
示例:
info
- 查看断点信息
info break
:查看断点信息(break
也可以用别名b
,或breakpoints
来表示断点)info b 2
:查看编号为 2 的断点信息
示例:
- 查看自动显示项信息
info display 1
:查看自动显示项 1 的信息
- 查看当前栈帧的局部变量值
info locals
:查看当前栈帧的局部变量值
backtrace
命令:backtrace
,别名:bt
作用:查看当前执行栈的各级函数调用及参数
watch
命令:watch
功能:执⾏时,监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者
2.6 修改变量
set var
命令:set var
作用:在调试过程中修改程序里变量的值
set var i=10
:把i
值修改成10
示例:
三,cgdb的特别命令
Esc
可以查看源代码,按方向键上下浏览,然后i
退出- cgdb的条件断点有点bug
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!