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 条件:将此编号断点设为条件断点

相关推荐
GeW25 分钟前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
by2099935 分钟前
Linux GCC/G++ 编译与 Makefile 构建
linux·运维·服务器·经验分享
迪菲赫尔曼1 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测
cq林志炫1 小时前
两个Linux服务器之间同步文件
linux·运维·服务器
yyuuuzz2 小时前
云服务器安全组规则优先级的机制记录
运维·服务器·网络·安全·阿里云·aws
无人生还别怕2 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
智购科技自动售货机厂家2 小时前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
jnrjian2 小时前
delete file shell 让 AI 写脚本
服务器·开发语言
数字新视界2 小时前
空调控制器AIRC800的智能化管理与应用实践
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
知已难寻3 小时前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack