Linux 下如何调试代码

debug 和 release

在Linux下的默认模式是什么?

release模式

那你怎么证明他就是release版本?

我们知道如果一个程序可以被调试,那么它一定是debug版本,如果它是release版本,它是没法被调试的,所以说我们可以来调试一下

在Linux下,我们要遇到的调试工具是gdb

使用gdb --v 命令来查看我们是否安装了gdb这个工具

如何调试程序?

直接:gdb + 可执行程序

比如,我们生成了一个可执行程序叫mycode

你就直接:gdb mycode

就会进入这样一个调试窗口:

如果是release 是无法被调试的:

使用:quit 退出gdb

如何在debug模式下调试程序,我们知道Linux 默认的模式是 release的,我们首先要把 release 模式变成 debug

gcc 操作后加上-g 就表示以debug模式编译该程序

这样之后我们在来操作:

使用:list 查看我们写的代码

使用qquit退出gdb


开始使用gdb

打开gdb: gdb 可执行程序 :比如:gdb mycode

退出gdb: qquit

调试:

  1. 显示我们所写的代码: l 指令,l 就是 list 的简写,从0行开始给代码排序显示l 0:

    这里并没有显示完全,我们按下 回车 就行了

2. 开始调试,类似vs中的f5gdb中是run 命令,可以简写为r

3. 打断点的操作

比如你想给第19 行打上断点,就执行:b 19

如何查看我们所打的断点的信息?
info b

我们还可以这样打断点:b mycode.c:20

查看一下:

我们还可以给函数打上断点:b mycode.c:main 这就表示直接给main函数所在的位置打上断点

如何删除我们所打上的断点?

我们根据断点编号来删除断点,之前当我们执行:info b 查看断点信息时会出现以下信息:

有了断点编号,我们要删除断点就直接:d + 断点编号

比如要删除第3个断点,就直接:d 3

如何开启断点和 禁用 断点:

接下来要说的这个呢,兄弟们可能就没怎么见过了啊,呃,在vs下,比如说我在某一行按f9打个断点。然后呢我们可以单击右键,就比如说选中这个断点单击右键,然后我们可以禁用这个断点,然后可以起启用这个断点,那么禁用断点。和启用断点也是一个断点的功能,那么它和删除断点是有区别的。

禁用断点呢,其实就是这个断点啊,它还在这儿,只不过暂时不起效果。但是删除断点的话,那么就代表这个断点就没了,打一个断点,然后把这个断点呢直接禁用掉,意思这个断点还在这儿,但这个断点不起作用。

怎样查看断点是开启还是关闭的呢?

使用info b 命令,我们可以看到:

如何关闭断点(注意不是删除)
disable + 断点表号

如何启动断点
enable + 断点编号

逐语句和逐过程

逐过程就是不进入函数 逐语句就是要进入函数

我们先来逐过程:next 简写为 n

逐语句:step 简写为:s

我们知道vs中有监视窗口,可以方便我们查看变量的值,那么gdb中我们该如何查看变量的值呢?

p 指令。如果你想要查看变量i的值就:p i 想要查看变量sum 的值就 p sum
p &i 就可以看到 i 的地址,p &sum 就可看到sum的地址。

如何一直让我们想观察的变量显示在屏幕上,不被我我们后面的指令顶上去?
display 指令,如果你想一直在屏幕上显示i 你就:display i

如何取消一直显示呢?
undisplay 指令,比如:undisplay + 编号 这个编号不是断点的编号而是display指令后的那个编号,

好了,如果我们不想让语句一条一条的执行,而是直接到达我们想要的那个地方,并且不打断点,那该怎么办。
until 指令,比如我们想要程序直接到第13行,就直接until 13

我们也可以单独的跑完某个函数

我们首先进入要走函数之后,直接输入:finish 就可以跑完这个函数

我们如何重当前断点直接执行到下一个断点?

直接按 c, 就行了

相关推荐
学思之道16 分钟前
给Linux操作系统命令取个别名
linux·运维·经验分享·学习方法
GOTXX23 分钟前
应用层协议HTTP
linux·网络·网络协议·计算机网络·http·fiddler
dong_beijing40 分钟前
GO语言工程构建示例-mac和linux适用
linux·运维·服务器
先生沉默先42 分钟前
Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)
运维·nginx·webgl
小小工匠1 小时前
系统安全 - Linux /Docker 安全模型及实践
linux·安全·系统安全
2201_761199042 小时前
nginx 负载均衡1
linux·运维·服务器·nginx·负载均衡
suri ..2 小时前
【Linux】进程第三弹(虚拟地址空间)
linux·运维·服务器
害羞的白菜2 小时前
Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)
linux·运维·笔记·jmeter·nginx·centos·负载均衡
纪伊路上盛名在2 小时前
如何初步部署自己的服务器,达到生信分析的及格线
linux·运维·服务器·python·学习·r语言·github
爱滑雪的码农2 小时前
快速熟悉Nginx
运维·nginx·dubbo