【Linux学习】Linux调试器-gdb使用

2024-04-22 13:12

本文主要是介绍【Linux学习】Linux调试器-gdb使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写目录标题

    • 🌂背景
    • 🌂gdb使用
    • 🌂指令总结:


🌂背景

程序的发布方式有两种,debug模式 release模式
其中,debug模式是可以被调试的,到那时release模式是不能被调试的;

debug模式和release模式的区别:
debug模式下形成的可执行程序给我们添加了调试信息的,而release模式形成的可执行程序给我们没有调试信息。在两个版本下的大小也不同,大小上,debug版本是大于release版本的。这也是为什么debug可以调试,release不可以调试。release版本通常面向用户和测试,而debug版本通常面向开发。

Linux gcc/g++出来的二进制程序,默认是release模式。所以默认是不能够调试的。

如何gdb以debug模式发布呢?
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。

由下图2可以发现,debug版本和release版本所形成的文件的大小有差异。
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3d0d77d41e334c098e070156a3f7在这里插入图片描述

怎么看到到底是不是真的添加了呢?

🌂指令readelf
功能:读取可执行程序的格式问题。
可执行程序也有自己的格式,格式为ELF, 您不仅仅是简单翻译为二进制,里面也是有格式的,比如里面是由符号表的,有表头表尾.

使用方法:

# readelf 可执行文件 

在这里插入图片描述
🌂使用readelf查看debug文件

输入指令:

# readelf -S debug版本的可执行程序 | grep -i debug //-i忽略大小写

在这里插入图片描述
根据结果:debug模式下形成的可执行程序给我们添加了调试信息的,而release模式形成的可执行程序给我们没有调试信息。

🌂gdb使用

🌂首先,gdb的安装:

输入指令:

# sudo yum install -y gdb

🌂gdb开始调试:

输入指令:

# gdb 可执行程序

如果想要退出,输入quit。
在这里插入图片描述

🌂指令list(l)

用法 :

(gdb) list    
//可以简写为l,显示可执行文件代码,显示的起始行与上次退出的时候,光标在代码处的位置有关 ,回车往后翻
(gdb) l N     
//显示第N行附近的代码,回车往后翻
(gdb) l 函数名  
//显示该函数附近的代码

在这里插入图片描述

🌂指令run,简写为r,相当于vs下的F5

功能:如果没有打断点的话,直接就运行完了,如果有断点,就会在程序执行的最近断点处停下来。
用法:

(gdb)run/r    //

在这里插入图片描述

🌂指令:b N/函数名等

功能:在第N行/指定位置处 打断点 ,注意:在函数名处打断点,是在函数里面第一行打的断点
用法:

(gdb)d N
(gdb)d 函数名等处

在这里插入图片描述

🌂指令info

功能:查看所有打的断点
用法:

(gdb)info b

在这里插入图片描述

🌂指令d N

功能:删除编号为N的那个断点

(gdb)d N   //删除编号为N的那个断点

在这里插入图片描述

🌂指令:disable/enable N

功能:禁用/打开编号为N的断点
用法:

(gdb)disable N  //禁用断点编号为N的断点(让他不起作用,但是不删除)
(gdb)enable N  //开启断点编号为N的断点(让他起作用)

在这里插入图片描述

🌂指令:n(next)/s(step)

功能:逐语句调试/逐过程 ---- VS中F11/F10
用法:

(gdb)n/s

🌂指令:p 变量名/&变量名

功能:临时(不是一直都有)查看变量的内容/地址
用法:

(gdb)p 变量名
(gdb)p &变量名

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/040e5440cf73449295b3556e9eb51f55.pn

🌂指令:
diaplay 变量名/&变量名
undisplay 编号

功能:常显示变量的内容/地址
取消对应编号的常显示
用法:

(gdb)display 变量名
(gdb)undisplay  编号

在这里插入图片描述

🌂指令:c(continue)

功能:从一个断点直接到下一个断点(范围查找)
用法:

(gdb)  c

🌂指令:finish

功能:假设在函数体内了,finish直接将函数执行完就停止(范围查找)
用法:

(gdb) finish

🌂指令:bt

功能:查看调用堆栈
用法:

(gdb) bt

在这里插入图片描述

🌂指令:until 行号

功能:在一个范围内,直接运行到指定行(范围查找)
用法:

(gdb) until N   //直接运行到第N行

🌂指令:set var name=value //将变量名为name的变量内容改为value

功能:调试的时候修改一个变量内容的(但是实际代码中不会改变)(不用改代码进行多分枝测试)
用法:

(gdb)set var N=10  //把N改为10

🌂指令总结:

gdb binFile 退出: ctrl + d 或 quit 调试命令:
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print (p ):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb


这篇关于【Linux学习】Linux调试器-gdb使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925875

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块