arm, core dump原理

1.

_initialize_arm_linux_tdep-->arm_linux_init_abi-->arm_linux_regset_from_core_section

_initialize_armobsd_tdep-->armobsd_init_abi-->armbsd_regset_from_core_section

strcmp (sect_name, ".reg"), (strcmp (sect_name, ".reg2")都需要这两个段

GDB读取内核转储文件,BFD库解读调试信息;

BFD, Binary File Descriptor library: 通过同统一的接口来处理不同的目标文件;

BFD,把目标文件抽象成统一的模型,跟ELF文件一样,最开始有描述整个目标文件总体信息的“文件头”,紧跟着是一系列的段,每个段都有名字、属性和段的内容,同时还抽象了符号表、定位表、字符串表等类似的概念。像 GNU 的一系列工具如编译器 GCC、调试器 GDB、链接器 ld 和 Binutils 中的工具都不直接操作目标文件或者转储文件,而是交由 BFD 处理。通过这种模型,可以编译器、调试器和链接器等工具同具体的目标文件格式剥离开来。而对新的文件格式来说,只需要在 BFD里面增加对这种格式的支持,就可以得到基于 BFD 的所有工具的支持。到目前为止,BFD 库支持大约 25 种处理平台,将近 50 种文件格式。对于 GDB 来说,  BFD主要提供了几方面的支持:1. 识别可执行文件和转储文件。BFD 可识别的各种文件类型包括 a.out, COFF,ELF 以及几种类型的转储文件。2. 访问不同格式文件的不同的段。BFD 通过解析文件头信息来确定文件中各
种指定段(如代码段,数据段,调试信息段等等)的名字,虚拟地址,大小,文件位置信息等。3. 支持特定的转储文件。BFD 提供了一系列的程序来决定存储在转储文件中的出错的命令类型,程序失败时的信号以及转储文件是否于指定的可执行文件相匹配。4. 定位符号信息。GDB 是使用 BFD 的内部的接口来确定在一个可执行文件或者符号文件中的什么位置能找到符号信息。GDB 本身会处理符号的读取,因而 BFD并不需要理解调试符号,但是 GDB 会使用 BFD 的缓存信息去找符号,字符串表等等。

GDB 在实现上主要由三大部分组成,用户接口,符号处理以及目标系统处理。

GDB 在源代码结构上:*read.c 这一系列文件用于各种类型的符号和目标文件的读取,*.-tdep.c这一系列的文件则用于实现跟特定的目标体系结构(arm,sparc, mips 等 等 )的调试支持

GDB 符号处理部分很依赖 BFD 的实现,如它支持转储文件的一个必要条件就是 BFD 中支持对这个转储文件的识别和解析。一旦 BFD 支持了,在 GDB 中完成一个跟体系架构相关的regset_from_core_section 函数就可以了。调试信息文件最初是在 GDB的 symfile.c 中通过 BFD 库提供的接口来打开的。BFD 通过读取文件的头信息来识别文件的类型,传递给 GDB,GDB 中的 find_sym_fns ()  函数通过 BFD 的返回值来定位使用那一组符号信息读取函数。符号信息读取模块在模块初始化阶段通过调用函数 add_symtab_fns()来让 GDB 识别。

GDB 的目标系统处理部分定义了 GDB 可以跟那种类型的机器语言工作,以及怎么跟它们工作。目标体系对象是由一个叫做 struct gdbarch *的 C 结构体实现的。GDB 把寄存器当作一组从 0 开始往上线性增加的数值的集合。其中把跟物理寄存器相关的部分叫做原始寄存器,跟物理寄存器无关
的部分叫做伪寄存器。读写 PC 指针通过接口 read_pc()跟 write_pc()。指定持有栈指针和 PC 指针的寄存器分别由 sp_regnum()和 pc_regnum()来完成。

GDB 需要理解在栈上的局部变量有哪些,而栈上跟函数调用相关的所有局部变量所在的区域就是通常所说的栈帧。几乎所有的体系结构上都有一个专门的寄存器来指向栈的末端。很多也会有另一个寄存器来指向当前栈帧的开始点。GDB 中描述栈帧的主要的数据结构是 struct frame_info。frame_info 包含关于寄存器的信息和一个指向跟栈帧相关联的函数的代码。而整个栈则通过一个 frame_info  结构体的链表来表现。用来访问栈帧数据的函数主要有 unwind_pc(),这个函数被传入的是一个指向 NEXT 栈帧的指针,返回 PREVIOUS 栈帧的 PC 值;另一个用来访问栈帧数据的函数 unwind_sp(),这个函数被传入的是指向 NEXT 栈帧的指针,返回在PREVIOUS 栈帧中的栈指针值;还有一个常用的函数是 frame_num_args(),这个函数被传入的是指向 THIS 栈帧的指针,返回当前栈帧上输入的参数的个数。

摘自论文:Linux内核崩溃转储机制的实现_朱辉;

关于GDB, debug, core dump功能的手册,官网:https://www.sourceware.org/gdb/

https://www.sourceware.org/gdb/documentation/GDB User Manual (PDF), GDB Internals Manual (wiki only), 其中Internals Manual只有网页版;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值