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
相关文章
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
60 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
129 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
41 1
|
5月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
73 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
31 0
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
371 2
|
6月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
92 0
下一篇
无影云桌面