变量是鬼鬼祟祟的。有时,它们会很高兴地呆在存放器中,然则一回头就会跑到客栈中。为了优化,编译器可能会完全将它们大年夜窗口中抛出。无论变量在内存中的若何移动,我们都须要一些办法在调试器中跟踪和操作它们。这篇文┞仿将会教你若何处理调试器中的变量,并应用 libelfin 演示一个简单的实现。
系列文┞仿索引
- 预备情况
- 断点
- 存放器和内存
- ELF 和 DWARF
- 源码和旌旗灯号
- 源码级慢慢履行
- 源码级断点
- 客栈展开
- 处理变量
- 高等话题
DWARF 地位
以这个简单的构造体为例:
- <loclist with 3 entries follows>
- [ 0]<lowpc=0x2e00><highpc=0x2e19>DW_OP_reg0
- [ 1]<lowpc=0x2e19><highpc=0x2e3f>DW_OP_reg3
- [ 2]<lowpc=0x2ec4><highpc=0x2ec7>DW_OP_reg2
- 根据法度榜样计数器的当前值,地位在存放器之间移动的变量。
根据地位描述的种类,DW_AT_location 以三种不合的方法进行编码。exprloc 编码简单和复合的地位描述。它们由一个字节长度构成,后跟一个 DWARF 表达式或地位描述。loclist 和 loclistptr 的编码地位列表,它们在 .debug_loclists 部分中供给索引或偏移量,该部分描述了实际的地位列表。
DWARF 表达式
应用 DWARF 表达式计算变量的实际地位。这包含操作客栈值的一系列操作。有很多 DWARF 操作可用,所以我不会具体解释它们。相反,我会大年夜每一个表达式中给出一些例子,给你一个可用的器械。别的,不关键怕这些;libelfin 将为我们处理所有这些复杂性。
- 字面编码
- DW_OP_lit0、DW_OP_lit1……DW_OP_lit31
- 将字面量压入客栈
- DW_OP_addr <addr>
- 将地址操作数压入客栈
- DW_OP_constu <unsigned>
- 将无符号值压入客栈
- DW_OP_lit0、DW_OP_lit1……DW_OP_lit31
- 存放器值
- DW_OP_fbreg <offset>
- 压入在客栈帧基址找到的值,偏移给定值
- DW_OP_breg0、DW_OP_breg1…… DW_OP_breg31 <offset>
- 将给定存放器的内容加上给定的偏移量压入客栈
- DW_OP_fbreg <offset>
- 客栈操作
- DW_OP_dup
- 复制客栈顶部的值
- DW_OP_deref
- 将客栈顶部视为内存地址,并将其调换为该地址的内容
- DW_OP_dup
- 算术和逻辑运算
- DW_OP_and
- 弹出客栈顶部的两个值,并压回它们的逻辑 AND
- DW_OP_plus
- 与 DW_OP_and 雷同,然则会添加值
- DW_OP_and
- 控制流操作
- DW_OP_le、DW_OP_eq、DW_OP_gt 等
- 弹出前两个值,比较它们,并且如不雅前提为真,则压入 1,不然为 0
- DW_OP_bra <offset>
- 前提分支:如不雅客栈的顶部不是 0,则经由过程 offset 在表达式中向后或向后跳过
- DW_OP_le、DW_OP_eq、DW_OP_gt 等
- 输入转化
- DW_OP_convert <DIE offset>
- 将客栈顶部的值转换为不合的类型,它由给定偏移量的 DWARF 信息条目描述
- DW_OP_convert <DIE offset>
- 特别操作
- DW_OP_nop
- 什么都不做!
- DW_OP_nop
DWARF 类型
DWARF 类型的表示须要足够强大年夜来为调试器用户供给有效的变量表示。用户经常欲望可以或许在应用法度榜样级别进行调试,而不是在机械级别进行调试,并且他们须要懂得他们的变量正在做什么。
DWARF 类型与大年夜多半其他调试信息一路编码在 DIE 中。它们可以具有指导其名称、编码、大年夜小、字节等的属性。无数的类型标签可用于表示指针、数组、构造体、typedef 以及 C 或 C++ 法度榜样中可以看到的任何其他内容。
- struct test{
- int i;
- float j;
- int k[42];
- test* next;
- };
推荐阅读
截止今朝开源中国收录了 44513 款开源项目,囊括了最热点的各类开源项目,而软件的评分在必定程度上代表了软件的质量和热度,而重要用 HTML/CSS 编写的项目中也有很多值得救鉴的处所,是以>>>详细阅读
本文标题:开发一个Linux调试器(九):处理变量
地址:http://www.17bianji.com/lsqh/37722.html
1/2 1