Linux的调试工具——gdb/cgdb

在学习调试之前我先介绍一个程序学习一下

前置知识点:1、C语言中的\n其实默认是\r\n(\r是回到当前行的行首)

2、显示器输出数据是行刷新的,只有到下一行时才会刷新缓冲区。若程序结束,会自动刷新缓冲区

如上述进度条代码就是知识点的体现

下面我们再将此进度条应用到某一场景(如下载)

上述代码未实现下载速度会出现波动的情况,大家可以自己实现一下

调试工具

gdb 文件名就可以调试代码了,但是此时是命令行互动窗口,我们会很蒙(感觉面对的是黑箱子)。因此推荐使用cgdb,它会让文件代码再开一个分屏,让我们可以看着代码调试,只是我们还不是图形化,我们从VS的鼠标操作变为指令操作

由于gcc/g++默认编译的是release版本,我们用gdb/cgdb的话会报错,因为release版本的可执行文件没有调试信息,不能调试。用上一篇介绍的-g选项会让gcc/g++编译成debug版本

然后就进入了调试界面

我们需要再摁一下c,就可以看到代码了

gdb/cgdb命令

q或quit命令:退出调试

r/run:类似VS中的F5,程序开始运行

n/next:逐过程,不进入函数内部,如同VS中的F10

s/step:逐语句,进入函数内部,如同VS中的F11

b/break 文件名:行号:在此行打断点(/------表示或者,\[\]------表示可以省略)

b 函数名:在函数开头设断点

d/delete 编号:可以删除指定编号的断点(此处的编号指断点的编号------设置断点时会自动按顺序编号,可通过下一条指令查看)。编号换成breakpoints,可以将所有断点删除

info b/break:打印所有断点信息

下列三个命令是让我们体验到如同VS中调试窗口那样显示数据------方便调试

p/print 表达式/变量:打印表达式/变量的值(一次)

display 变量名:跟踪显示每个变量的值(只要程序停止就打印)

undisplay 编号:取消跟踪显示(编号是display某个变量时就会按顺序给这些变量编号,display打印时可以看到)

下面三个命令是可以实现跳跃调试的命令

until 文件名:行号:执行到指定行号(遇到断点也会停止)

c/continue:从当前位置开始执行直到遇到断点

finish:执行直到当前函数结束

disable 编号:可以使当前断点失效(如果没有确定问题解决,我们先不要急着删除断点)。编号换成breakpoints,可以将所有断点失效

enable是是断点重新生效,格式与disable相同

拓展:

watch 表达式/变量:监视表达式/变量的值,一旦发生变化就停止执行并打印

set var 变量名=某值:当我们发现某个错误是由于某个变量的值导致的,我们可以通过此命令将调试时变量值修正,检查结果是否正确,然后还需要去源码将错误修正

b 行号 if 条件:条件断点,满足条件时才会在此断点停止

condition 编号 if 条件:将此编号断点设为条件断点

相关推荐
JeJe同学2 小时前
Docker镜像导入、容器启动
linux·运维·docker
Jason_zhao_MR2 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
闲云野鹤在人间2 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
一个风轻云淡3 小时前
GCC 和 GDB命令简单解读
java·linux·前端
H.莓飛4 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
资料库014 小时前
Linux 8个常见运维故障排查
java·linux·运维
零基础1235 小时前
Ubuntu 常用命令汇总
linux·运维·开发语言
Android系统攻城狮5 小时前
Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
xiaoqiMikko5 小时前
Linux 实战(一):CentOS 7、Rocky 9、Ubuntu 24.04 三台真机实测 —— 认清系统、换源、装包的版本坑
linux·centos