Linux:gdb调试器的解析+使用(超详细版)

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: Linux:gdb调试器的解析+使用(超详细版)

Linux调试器-gdb

背景:

程序的发布方式有两种,debug模式和release模式

debug模式:可以被调试;

release模式:不可以被调试。

为什么需要debuy和release这两个模式呢?

答:程序员在开发的时候需要去调试代码,所以需要debuy模式,而用户一般不懂这些代码的调试不需要debuy模式,只需要快速的下载和安装,所以release把调试信息的部分去掉了,体积也得到了减小,更适合给用户使用(测试环节也是使用release模式)。

Linux gcc/g++出来的二进制程序,1.默认是release模式,2.默认是动态链接。
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项(生成debug模式)。

此时:我们还需要知道调试究竟是在干什么?

      1.找到问题(查找、范围查找、局部逐行查找……)

       2.解决问题(根据上下文代码逻辑)

实践:

首先:如果没有安装gdb:yum install -y gdb

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项(生成debug模式),这里我们为了方便将执行放入到makefile中(自动构建)。

此时再写一个用于调试的程序:test.c

基于上面得到kezhix程序mytest后还可以查看可执行程序的格式:
readelf -S mytest | grep -i debuy

调试的指令:

命令 解析
ctrl + d 或 quit 调试命令 gdb binFile 退出
list( l )  行号 显示binFile源代码,接着上次的位置往下列,每次列10行。
list( l ) 函数名 列出某个函数的源代码。
run( r ) 运行程序。
next( n ) 单条执行。
step( s ) 进入函数体调用
break(b) 行号 在某一行设置断点
break(b) 函数名 在某个函数开头设置断点
info break( b ) 查看断点信息。
finish 执行到当前函数返回,然后停下来等待命令
print( p )  打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量 打印变量值(显示一次)。
set var 修改变量的值
continue( c ) 从当前位置开始连续而非单步执行程序
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

调试指令的使用:

有了上面的基础,我们就可以来调试程序了:

list/l  行号:显示binFile源代码,接着上次的位置往下列,每次列10行。回车键实现下翻!

r或run:运行程序。相当于VS的F5!

break(b) 行号:在某一行设置断点,相当于VS的F9!

info break :查看断点信息。这里Linux引入了断点编号的概念,即:给断点设置编号,开启/关闭断点需要使用对应的断点编号!

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点
enable breakpoints:启用断点

n 或 next:单条执行。相当于VS的F10!
s或step:进入函数调用。相当于V的F11!

display 变量名:跟踪查看一个变量,每次停下来都显示它的值。
undisplay:取消对先前设置的那些变量的跟踪。

需要注意的是这里也使用了,序号的概念,取消跟踪需要输入对应的序号!

continue(或c):从当前位置开始连续而非单步执行程序,直接从一个断点到下一个断点。

breaktrace(或bt):查看各级函数调用及参数,现在所属调用的堆栈。

如下:在test.c的main()主函数的第22行!

finish:执行到当前函数返回,然后停下来等待命令。

需要注意:finish在主函数中使用是无效的,必须在调用的函数中使用才有效!

如下:因为在for循环设置了断点所以有一次的停留,回车后就直接运行到函数结束,并回到主函数的下一个断点!

until X行号:跳至X行.

需要注意:until跳转无法越过断点,还是会在断点停留,可以回车跳过断点。

set var name=value:修改一个变量的内容(不需要改代码,进行多分支测试!)

       当我们在gdb(调试)时输入一条指令,是会自动记录最近一条指令的,所以我们想继续上一条指令操作时就可以<回车>来继续执行。

以上就是个人学习的见解和学习过程的解析,欢迎各位大佬在评论区探讨,交流!

如果本篇对你有帮助的话,三连支持一下吧。

感谢大佬们的三连! 感谢大佬们的三连! 感谢大佬们的三连!

                                             

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
2月前
|
安全 Linux iOS开发
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
358 53
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
2月前
|
Linux API iOS开发
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
222 14
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
7月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
331 16
|
7月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
143 20
|
7月前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
956 12
|
8月前
|
Linux
Linux命令的基本格式解析
总的来说,Linux命令的基本格式就像一个食谱,它可以指导你如何使用你的计算机。通过学习和实践,你可以成为一个真正的“计算机厨师”,创造出各种“美味”的命令。
206 15
|
6月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
345 0
|
8月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
375 11
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
11月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
487 11