千家信息网

GDB 的秘密(九)

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,在上节博客中,我们学习了链接器的知识。那么本节课我们继续学习嵌入式开发中的一些常用的操作,今天我们学习的是在 GNU 开发中,必不可少的调试利器 GDB。可能搞底层的同志或多或少的听过 GDB,但是觉
千家信息网最后更新 2025年12月03日GDB 的秘密(九)

在上节博客中,我们学习了链接器的知识。那么本节课我们继续学习嵌入式开发中的一些常用的操作,今天我们学习的是在 GNU 开发中,必不可少的调试利器 GDB。可能搞底层的同志或多或少的听过 GDB,但是觉得它总是那么的神秘,很模糊那么我们今天就来看看 GDB。

先从它的概念开始介绍,什么是 GDB 呢?它是 GNU项目中的调试器(gnu debuger),它的作用是能追踪程序的执行,也能恢复程序崩溃前的状态。那么我们为什么需要 GDB 呢?在我们日常的软件开发中,难免会写出一些难以发现的 bug,那么这些 bug 又是昙花一现,马上就结束了。我们来不及反应程序就崩溃了,因此我们找不到 bug 的来源。因此我们需要在软件开发的过程中进行调试,这也便是 gdb 的由来。

下来我们来看看 GDB 的一些常规性应用,一般包括以下几方面:

1、自定义程序的启动方式(指定影响程序运行的参数);

2、设置条件断点(在条件满足时暂停程序的执行);

3、回溯检查导致程序异常结束的原因(Core Dump);

4、动态改变程序执行流(定位问题的辅助方式)。

那么 GDB 又是怎样进行启动的呢?它的启动方式可以大致分为两种:直接启动和动态连接直接启动又分为三种:gdb; gdb test.out; gdb test.out core; 动态连接:gdb test.out pid

下来我们来看看 GDB 应用的一个示例,如下

介绍了它的启动方式后,我们再来看看用它如何进行断点调试。在介绍断点调试之前,我们首先来看看在 GNU 中的断点类型。它分为三种:软件断点、硬件断点、数据断点。软件断点是由非法指令异常实现的(也即是通过软件实现),硬件断点和数据断点则是由硬件特性实现(共同的特点是数量有限)。

接下来我们来看看软件断点的相关操作:

1、通过函数名设置断点:

如 a> break func_name [ if var = value ]

b> tbreak func_name [ if var = value ]

2、通过文件名行号设置断点:

如 a> break func_name:line_num [ if var = value ]

b> tbreak func_name:line_num [ if var = value ]

上面的 break 和 tbreak 两种方式的区别是,tbreak 设置的是临时断点,而 break 设置的则是永久断点。下面我们继续来看看断点操作的一些常用命令

介绍了软件断点的相关操作之后,我们来继续介绍硬件断点的操作及应用。那么我们是在什么样的情况下才会去使用硬件断点呢?1、当代码位于只读存储器(Flash)时,只能通过硬件断点调试;2、硬件断点需要硬件支持,数量有限;3、GDB 中通过 hbreak 命令支持硬件断点;4、hbreak 与 break 的使用方式是完全一致的。

我们先来看看数据断点:在 GDB 中支持数据断点的设置,watch 命令用于监视变量是否被改变(其本质也为硬件断点)。watch 命令的用法:watch var_name,在 GDB 中可以检查任意内存区域中的数据。命令语法:x /Nuf experssion ,其中 N 是需要打印的单元数,u 指的是每个单元的大小,f 指的是数据打印的格式。我们来看看 x 命令中参数 u 对应的单位,如下所示

接下来我们来看看 GDB 中的打印格式,如下图所示

在这块我们可以利用这个特性用来判断系统大小端,示例代码如下

如果是上面的那种情况,那么此系统就是小端;反之则是大端。接下来看看函数调用栈的查看(backtrace 和 frame)。

backtrace 是用来查看函数调用的顺序(函数调用栈的信息);frame N 则是切换到栈编号为 N 的上下文中;info frame 是用来查看当前函数站调用的栈帧信息的。栈帧信息就是我们之前在 C 语言中讲到的函数活动记录,如下

我们再来深入的看看 info 命令,如下

那么在调试中还有一些小技巧,比如在断点处自动打印:display /f expression,相应的去除打印就是:undisplay;查看程序中的符号:whatis,ptype;GDB 中的代码查看:list,set listsize N;GDB 中的 shell 操作:shell。看看断点出自动打印的示例,如下

符号查看的示例如下

通过今天对 GDB 的学习,总结如下:1、GDB 支持数据断点的设置(一种类型的硬件断点);2、watch 用于监视变量是否被改变,x 用于查看内存中的数据;3、GDB 支持函数调用栈的查看(backtrace,info frames);4、GDB 支持运行时对程序中的符号进行查看(whatis,ptype)。

断点 硬件 程序 数据 函数 命令 软件 方式 支持 示例 学习 开发 接下来 代码 信息 动态 就是 符号 应用 内存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 戴尔服务器管理口插上没反应 易手车互联网科技 海鹰数据库技术 软件开发岗的求职信 当前的网络安全威胁和风险 腾讯数据库域名规范 网络安全电话会议纪要 惠山区定制软件开发商店 软件开发与设计是干嘛呢 数据库查询所有课程的信息 剑三扫码登录正在连接服务器 互联网科技体验馆设计 事业单位计算机数据库理论知识 网络安全文明上网加文字的手抄报 当一个服主改名字后进服务器 关于网络安全法的正确说法有 淄川食品软件开发价格 基于安卓的软件开发课程 樱花内网穿透无法连接服务器 西安软件开发招聘时间 长沙旅游哪里学电脑软件开发好 网络安全接入终端 无法连接到服务器怎么办 数据库实训报告绪论 查询数据库表行数据 vb 数据库哪个版本号 服务器主板最高支持什么内存 安卓tv电视直播软件开发 魔兽世界为什么选择其他服务器 mysql数据库误删除恢复
0