gdb对dwarf调试信息的解析和使用

dwarf 栈解析格式小结 eh_frame 所有的dwarf都在eh_frame的节当中,具体格式如下: 一般一个cie对应多个fde,一个fde对应相应函数的寄存器恢复信息,不仅仅是栈信息。 当我们拿到eh_frame后,就需要解析cie和fde. (http://dwarfstd.org/doc/DWARF4.pdf) 官方文档有很详细的东西,不适合入门感觉。根据结尾的例子来分别讲解cie和fde. common information entry encoding cie : common information entr 阅读详情

Dwarf调试信息Consumer——gdb

1      引言

前面介绍过dwarf调试信息格式,内容包括有哪些类型的调试信息,调试信息的存放格式、某些调试信息的编码方法等。本文的内容主要调试信息是怎样被解析使用的调试信息作为编译器为了实现源码级别调试生成的内容,其主要的consumer自然是gdb。下面介绍gdb中如何使用dwarf调试信息。

本文是一个基于源码debug过程的分析文档,内容比较细,偏笔记性质的。总结抽象工作做得不多。所以其中的内容以及一些流程图都会比较细节。下面提供一个总结概括性的ppt文档点击打开链接。

2      调试信息回顾

在介绍gdb如何读取dwarf调试信息之前,我们先回顾一下有哪些调试信息,调试信息在elf文件中的位置。

在使用gcc编译程序的时候,加上-g参数,那么最后生成的目标文件中会有调试信息,调试信息格式使用dwarf2格式。使用readelf工具加上-S参数,可以查看目标文件中有哪些调试信息section,示例如图2-1所示。

 

图 2‑1 调试信息类别

       可以看到.debug_*都是调试信息的section,每个section代表不同类型的调试信息,表2-1介绍不同类型调试信息。

 

表格2‑1调试信息类型说明

Section

说明

.debug_info

调试信息主要内容,各个DIE

.debug_abbrev

调试信息缩写表,每个编译单元对应一个缩写表,每个缩写表包含一系列的缩写声明,每个缩写对应一个DIE

.debug_line

行号信息

.debug_macinfo

宏信息,编译器-g3参数才会产生宏信息

.debug_aranges

范围表,每个编译单元对应一个范围范围表,记录了该编译单元的某些ENTRY的text或者data的起始地址和长度,用于跨编译单元的快速查询

.debug_pubnames

全局符号查询表,以编译单元为单位,记录了每个编译单元的全局符号的名称

.debug_frame

函数的堆栈信息

.debug_str

.debug_info中使用到的字符串表

.debug_loc

Location list

 

3      Gdb使用调试信息

Gdb中实现源码级别调试,主要实现名称、位置的映射。而这些信息在gdb内部通过symbol来记录的。Symbols按照一定的关系组合在一起,形成symbol table。在gdb中有三类符号表。

 

表格3‑1 gdb中的符号表

符号表

说明

Minimal_symbol table

该符号表通过分析elf文件中的.symtab section得来,该section中记录的是在elf文件的链接过程中所必须的一些全局的符号。该符号表在没有-g参数的时候也会有。

Partial symboltable

顾名思义,部分符号表,里面记录的是部分的符号的部分的信息,在gdb读入symbol file的时候会初步分析调试信息,建立这么一张partial symbol table,它有两个作用:1,满足一部分的调试需求;2,gdb可以根据partial symtab读入full  symtab。

Full symbol table

完整符号表,里面记录的是完整的符号信息,源码级别调试实现的基础。由于其信息很多,占的内存空间很大,所以gdb在一开始读入symbol file的时候并不会产生这么一个full symtab,而是在后续的调试过程中,如果有需要完整符号表的地方,才会把该cu的full symtab读入,这样效率较高。

 

Gdb调试主要依靠这三个符号表实现,minimal symtab比较简单,也不属于调试信息分析的范畴,本文不会对minimal symtab多加叙述。Partial symtab和full symtab的建立是根据调试信息完成的。下面gdb对调试信息的使用过程也是这么两张符号表的建立的过程。

3.1    Debug_info——PartialSymtab

3.1.1     Partial symtab简介

在展开partial symbol相关的讨论之前,我们先看看partialsymbol是什么。

在gdb中使用structpartial_symbol,来描述一个partial symbol,其中包含的信息如下表所示。

 

表格3‑2 struct partial_symbol

数据项

说明

Domain

该symbol的类型:变量、函数、type、label等。

Address_class

说明该符号的地址类型,即在什么地方可以找到该符号:寄存器、arglist、local变量、typedef类型等。

Struct general_symbol_info

所有类型符号的基础信息:name、value(是个union,取决于符号的类型)、在哪个section等。

 

Partial symbol以一定的规则组合在一起,形成partial symtab,gdb中以source file为单位,每个source file对应一个struct partial_symtab,一个objfile中的所有的partial_symtab组成一个链表。Partial symtab中只记录该file中static类型的和global类型的一些符号。Struct partial_symtab的包含的信息如下表所示。

 

表格3‑3 struct  partial_symtab

数据项

说明

Struct partial_symtab *next

Objfile的所有partial_symtab形成一个链表

Filename、fullname、dirname

文件名、路径等信息

Struct objfile *objfile

对应是哪个objfile

Struct section_offsets

Objfile的各个section的offset

Textlow、 texthigh

该file的地址范围

STM32 VS Code调试实战:从GDB到寄存器的全链路解析 嵌入式调试本质是理解代码、编译器与硬件三者协同行为的过程。当传统IDE隐藏底层细节导致变量不可见、断点失效或寄存器读取异常时,基于GDB+OpenOCD的VS Code调试方案提供了透明可控的调试链路——它依托DWARF调试信息实现源码级变量映射,通过SVD文件支撑寄存器语义化查看,并借助RTOS感知能力可视化任务状态。这种架构不仅解决STM32常见调试痛点(如ADC采样值不可见、FreeRTOS堆栈溢出难定位),更适用于ARM Cortex-M全系列芯片的深度分析场景,涵盖裸机驱动开发、实时系统调优及硬件 阅读详情

相关推荐

调试信息(debugging information)——解析DWARF文件

gdb调试信息和dwarf文件简单解析

Dong_HFUT的博客 1万+

GCC -g 调试选项全解析:DWARF、GDB 与发布版调试信息分离

在 Linux C/C++ 开发中,编译时是否携带调试信息,直接决定程序崩溃后能否被有效剖析。调试信息(如 DWARF 格式)是编译器将机器指令与源码行号、变量类型、作用域等建立映射的元数据,gdb 等调试器依赖它将地址还原为可读的调用栈和变量值。缺少它,线上段错误只能看到函数名和地址;合理生成与保留它,则能在发布版中通过分离调试文件、strip 与 debuglink 兼顾体积与可排查性。GCC 的 -g 选项正是控制这一能力的核心开关,并可与 -O 优化级别、-g1/-g2/-g3 等级配合,服务于开发

weixin_33617691的博客 212

gcc/gdb: DWARF/macro

详细的调试信息,带有宏定义

mzhan017的博客 528

GDB单步调试底层原理:ptrace、断点与DWARF解析

调试器并不是逐行解释执行源码,而是在真实CPU上通过Linux ptrace等机制暂停被调试进程,再借助编译器生成的DWARF调试信息把机器地址映射回源码行。符号表、行号表、断点写入0xCC、单步与条件断点/观察点的实现差异,共同解释了断点位置偏移、变量optimized out、core文件栈回溯异常等常见现象。对C/C++ Linux开发、线上问题定位和性能分析而言,理解-g/-O0与优化等级的取舍,能显著减少在断点、单步和栈回溯上的试错成本。从GDB单步调试切入,串联编译期调试信息、断点实现与ptra

weixin_28677451的博客 27

解密携程风控:user-dun算法中的自定义base64与多模式加密机制剖析

本文深入剖析了携程旅行APP风控核心组件libduncode.so中的user-dun算法。文章重点解密了其采用的自定义Base64编码机制与多模式加密选择逻辑,并详细阐述了如何通过动态分析与静态还原,理解算法与设备指纹的深度绑定关系,为逆向分析类似混淆加固的风控算法提供了系统的方法论。

weixin_29323049的博客 340

深入解析国家企业征信系统瑞数6vmp算法逆向实战

本文深入解析了国家企业征信系统所采用的双层防护机制,重点聚焦于瑞数6代vmp算法的逆向实战。文章详细拆解了从加速乐521状态码的绕过,到瑞数412挑战的核心算法还原过程,提供了通过动态Hook、日志分析进行算法逆向,并用Python实现自动化请求链的完整技术方案,旨在为安全研究与技术学习提供参考。

yellow的专栏 612

Windows游戏玩家必看:用Process Lasso优化CPU优先级和核心绑定,告别卡顿

本文为Windows游戏玩家详细介绍了如何使用Process Lasso优化系统性能。通过设置CPU优先级和核心绑定,可以智能管理进程资源,确保游戏获得最高调度权限,有效减少因后台程序干扰或Windows调度机制不完善导致的卡顿与帧数波动,从而提升游戏流畅度与稳定性。

weixin_29299807的博客 2217

电信天翼云OS(ctyunos)内网离线安装Docker-CE保姆级避坑指南(附完整依赖包清单)

本文提供电信天翼云OS(ctyunos)内网环境下Docker-CE的离线安装全攻略,涵盖依赖分析、离线包制备、冲突解决等关键步骤。针对金融、政务等隔离网络场景,详细解析如何通过本地仓库构建和优化配置,实现高效安全的容器化部署,助力企业快速搭建内网Docker环境。

397

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 188

2023,程序员的出路在哪里?

可是似乎从30岁开始这工资就没涨过,前面跳槽几次涨的薪水在30岁以后跳槽已经不管用了、定格了,这几年由于市场环境不景气,程序员竞争越来越激烈,36岁跟30拿的工资一模一样,不仅工资拿的一样,反而事情还越来越多了,这些都意味着什么?处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。虽然目前不少大型互联网企业都在进行结构性调整,但是从互联网行业发展的基本面来看,未来在产业互联网发展的过程中,IT行业和传统行业将会释放出大量的就业岗位,所以未来程序员的发展空间还是非常值得期待的。

AI天才研究院 20万+

如何成为一名高级数字 IC 设计工程师(6-7)数字 IC 验证篇:DEBUG 技巧

不懂验证的设计不是好的设计;UVM 验证思维是指导缜密的芯片设计的导师;推荐书籍《芯片验证漫游指南》。

新芯设计的博客 1605

【Com通信】Com模块的事件帧发送及周期报文的快慢发送机制

Com模块的事件帧发送及周期报文的快慢发送机制

qq_36056498的博客 2334

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: gdb动态库调试分析文档
下一篇: 基于linux多线程调试分析的ecos多任务调试设计
JS072110
博客等级 码龄16年 16粉丝 8原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值