Linux之gdb的使用

简介: 学会在Linux下调试代码

当我们能够在windows下,使用vs 2019等编译器去进行调试的时候,我们可以将在Linux下使用gdb调试这两者之间进行对比:

调试这个操作,在方法上有区别吗?(Linux和windows)其实,在调试思路上是一样的,在调试的操作方式上一定不一样。

因此,在学习Linux的gdb调试时,一定要抓住我们的调试思路去学习。

在Linux下,我们使用的是命令行调试。

因此,本章着重解析的是操作方法,不是思路:

首先我们先写好测试用的代码:

IV2Y0GF}YCGAYHYP{IJFY]5.png

并且将代码写入makefile中

BTRJLNPSU]O95[~1(ANTWRV.png

接着开始调试:调试工具:gdb

使用gdb+需要调试的代码文件来开启调试模式:

]KEW8I}916TJ2I)OMA`EU_S.png

但此时这里显示的是没有可调试的地方:

VAD97V8BT5)EWBBZKYUJFS4.png

因为在默认情况下,gdb无法对程序进行调试。这是为什么?原因很简单

程序分为debug版本和release版本。只要debug版本才能进行调试。

在Linux中,用gcc/g++生成的软件程序是release版本!

(这里顺便复习一下:gcc默认:动态链接、默认release)

所以,我们需要将其变成debug。我们在编译软件的时候,加上-g。

%Z}1DVCE)@DTCA]NE~H%UHC.png

这时候再make一下,编译后的程序就是debug版本了。

这时候,就能进行正式调试了。

第一步:查看代码:指令:l(L的小写)

01]}IUC14IFFJG25F@X1ROG.png

解释:第一个输入L,不从0行开始显示。输入l 0,则从0行开始。按下空格,gdb会记住前一次的行数,会从下一行开始,也就是说,只需要l一次,那么剩下的直接按回车就行了。

在将代码全部显示出来后,开始打断点:

通过指令:b {行号}即可打上断点,其中b是break的简写

O0V4FS{KWMY_8UMJW{W5O`I.png

通过指令:info b来查看断点的编号

%B_7A@(T[O]HV)_Z8@8UPJG.png

去除断点:使用d {断点编号},注意是编号,不是断点的行号,d是delete的简写。

RKUT%SN9J6$43C)OQT7BL$9.png

打上断点后,通过指令r,进行跑程序,会在断点除停下来,r的简写是run

OQ)OL)GON5~W)[Y](5SC0(O.png

在这个断点时,我们有两种选择:一是直接跑完断点(逐过程),二是慢慢地跑断点的内容(逐语句)

如果是逐过程:通过指令:n,是next的简写

7QR`QR2DICUL5%U0SDP7I8U.png

如果逐语句,进入函数:通过指令s,是step的简写

V$]%$BM69F6XN68(V~IVEFP.png

进入Print函数,使用n走下一步,直到走完这个函数。

当有多个断点的时候,我们想要从一个断点到另外一个断点,那么可以使用指令:c,continue的简写。

当我们进入一个函数后(这里依然使用24行的函数,也就是第一个断点的函数进行举例),想要查看main函数的栈堆情况,可以使用指令bt

LKQ3NXIAUL4FVOV]FS]G9)J.png

进入这个函数后,我们只想要跑完这个函数,又不到下一个断点,那么使用指令finish

V_2E1_1RFA{L`LMP}U35`U7.png

在调试的时候,我们想要看到变量的改变:

指令:p {想要看到的变量}

7)4IPAOMZCS4LC@]N7U8$DB.png

如果想要一边看变化,一边跑,那么通过指令:display {想要查看的变量名}

53~VR}M`S0NJGVF_~2SB24G.png

不想要常显示的时候,使用指令undisplay {行号},比如:undisplay 2,就是把sum去掉

指令:until {行号},代表跳转至指定行号。如果指定的行号是没有代码的行或者是没有什么意义的,就会自动跳转到有实用意义的行。

修改变量的值:set var {变量}=val

2M9ONQSH(_UQQIDOWDD]~T9.png

这些指令就是能够在gdb的进行调试的指令啦!

总结一下:

1.在调试之前,我们在代码编译的时候,加上-g,使之变成debug文件

2.用l 0,然后不断回车,查看完整代码信息,也能l {行号},查看所需要的代码信息

3.打断点:b {行号}

4.查看断点:info b

5.跑程序:r

6.跑到断点后,逐语句:s,逐过程:n

7.查看变量:p {i}

8.常显示:display {i}  除去常显示:undisplay

9.修改变量值:set var {} = val

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
1月前
|
NoSQL Linux 开发工具
【Linux】环境基础开发工具的使用之gdb详解(三)
【Linux】环境基础开发工具的使用之gdb详解(三)
|
1月前
|
NoSQL Linux 程序员
Linux:gdb调试器的解析+使用(超详细版)
Linux:gdb调试器的解析+使用(超详细版)
49 1
|
NoSQL Linux 编译器
【Linux】——调试器-gdb的使用
【Linux】——调试器-gdb的使用
|
1月前
|
NoSQL Linux 编译器
『Linux升级路』基础开发工具——gdb篇
『Linux升级路』基础开发工具——gdb篇
|
1月前
|
NoSQL Linux 开发工具
【linux】git和gdb调试工具
【linux】git和gdb调试工具
54 5
|
2月前
|
NoSQL Linux C语言
【Linux】Linux调试器-gdb使用
【Linux】Linux调试器-gdb使用
【Linux】Linux调试器-gdb使用
|
2月前
|
NoSQL Linux 编译器
【Linux工具篇】调试器gdb
【Linux工具篇】调试器gdb
21 0
|
程序员 编译器 Linux
linux gdb-多线程调试
相信使用C/C++语言开发软件的程序猿们都经历过‘栈溢出’的问题。‘栈溢出’问题通常十分的隐蔽,有的时候问题复现也十分的困难。每当软件出现莫名其妙的问题时,总是有人怀疑是不是栈溢出了,但是问题的排查又十分的困难,所以,‘栈溢出’就是广大C/C++开发者的噩梦。
119 0
|
NoSQL IDE Linux
linux gdb-多线程调试
linux下应用程序的调试工具主要就是gdb,可能你已经习惯了IDE形式的调试工具。也许刚开始使用gdb作为调试工具,会有诸多的不变,但是一旦你学会了如何使用gdb你就会被其富有魔力的功能所吸引的,下面开始逐步的学习linux下gdb的使用方式。
352 0
|
11天前
|
Web App开发 Linux 网络安全
工作中常用到的Linux命令
工作中常用到的Linux命令