【Linux】Linux调试器--gdb的使用

简介: 【Linux】Linux调试器--gdb的使用

有时候,我们并不需要被教导,而是应该被不断的提醒。


2.png


一、gdb的介绍


1.
gdb是linux上面的调试器,是非图形化界面纯命令行调试的,用起来非常的麻烦!

2.
安装gdb工具的命令

sudo yum install -y gdb


3.

默认情况下,gdb无法进行对gcc现在发布的程序进行调试,因为gcc默认生成的软件是realease版本的,没有调试信息,无法被调试器gdb调试,并且gcc是默认动态链接的,如果想静态链接还需要加static选项,所有gcc是有两种默认行为的。


4.

gcc编译时添加-g选项可以使得gcc发布的程序软件为debug版本,这样就可以通过gdb对程序进行调试

mytest_g:mytest.c
  gcc mytest.c -g -o mytest_g
.PHONY:clean
clean:
  rm -f mytest_g


二、debug和realease版本的区别



1.

debug是给程序员用的版本,添加了调试信息,用于解决软件或程序中出现的问题,realease是发行给客户使用的版本,并未添加调试信息,只需要给客户提供优越的产品使用环境即可,至于是否能够debug调试,这是程序员才应该关心的主要问题。


2.

可以看到debug版本的字节大小是要大于realease版本的,这是因为其中添加了调试信息。

99ac7890d5854d969c36f300eaae7ffc.png

3.

通过指令可以读取可执行程序的二进制构成,显示出具体的二进制软件的内部所形成的特定格式。

值得注意的是:每一个二进制程序不仅仅只是一堆二进制代码,他们内部都是有特定格式的,Linux中形成的可执行程序是elf格式。

想要了解elf格式的可以去看看 深入了解计算机系统这本书

[wyn@VM-8-2-centos test_dir]$ readelf -S mytest_g | grep debug

下面就是debug中所添加的调试信息,而realease版本是没有这些调试信息的


fefd745ce2944dcf80d30c7e2186035c.png

三、gdb的使用

1.显示代码: l+行号(list)指令


gdb会默认记住历史上曾经输入的指令,l+0输入后gdb会从第零行开始显示部分的代码,我们继续回车便可以显示后半部分的代码,直到显示完停止


e4d4540ab2e14813b9f52a27d96ec40e.png



2.设置断点: b+行号(breakpoint)

0d2d5629968d4c969a15a108246c823a.png


3.查看断点: info b

5fb418e98fef4872ad7794b6ac0d9b27.png

f3cf5c1f289042ac884670fe80a2fb68.png

4.取消断点: d + 断点编号


a575da23262e4b279f4e182228351d82.png


5.调试运行:r(run)


vs2022环境:

1.运行调试:fn+f5如果有断点,就停下来,如果没有断点就直接运行起来,如果想要跳到下一个断点,可以继续按fn+f5

2.取消调试:fn+shitf+f5

3.直接运行:fn+crtl+f5直接运行,有断点也不会调试


linux环境

1.直接运行:./+二进制可执行程序

2.调试运行:run

173c507b02e74bd194c60eb7d5b4a452.png


6.逐过程:n(next)

aa90b8c1bc23406f996c3ef5505f0b55.png

7.逐语句:s(step)

2e7261b91d344671824ede5a8f641ce8.png

8.运行至下一个断点处:c(continue)

10794eae685a43368ea8c9130e8317f6.png

9.查看函数调用堆栈:bt

bdfe1f58a3694447a8d6e69dea2564f1.png

10.直接运行完当前函数,然后返回到调用地方:finish

4229dd924ded43b08fd203fed5c2cca4.png


11.临时查看变量或地址的值:p + 变量或地址

50b38e416a6541e68a86752f07bff3a0.png

12.监视跟踪查看/取消监视跟踪查看:display/undisplay

a788a88598084c1e9dc707ae841a39bb.png

13.跳转到指定行:until+行号

bd9b917a59624848bd9f15f91fb76a54.png

14.修改变量的值:set var

68d045748133402584e31c89c7321bd5.png


15.查看当前栈帧局部变量的值:info locals

074202026f8842b29c0769b836a88acf.png

16.禁用/启用断点:disable/enable 断点编号

356695964738444db3ede2634028fe62.png















相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
67 10
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
112 3
|
4月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
178 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
6月前
|
NoSQL Linux C语言
GDB:强大的GNU调试器
GDB:强大的GNU调试器
|
6月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
92 0
|
7月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
405 2
|
7月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
4月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
121 0
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
49 1
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
36 0