作家
登录

开发一个Linux调试器(九):处理变量

作者: 来源: 2017-10-09 12:13:05 阅读 我要评论


开辟一个Linux调试器(九):处理变量

变量是鬼鬼祟祟的。有时,它们会很高兴地呆在存放器中,然则一回头就会跑到客栈中。为了优化,编译器可能会完全将它们大年夜窗口中抛出。无论变量在内存中的若何移动,我们都须要一些办法在调试器中跟踪和操作它们。这篇文┞仿将会教你若何处理调试器中的变量,并应用 libelfin 演示一个简单的实现。

系列文┞仿索引

  1. 预备情况
  2. 断点
  3. 存放器和内存
  4. ELF 和 DWARF
  5. 源码和旌旗灯号
  6. 源码级慢慢履行
  7. 源码级断点
  8. 客栈展开
  9. 处理变量
  10. 高等话题

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_fbreg <offset>
      • 压入在客栈帧基址找到的值,偏移给定值
    • DW_OP_breg0、DW_OP_breg1…… DW_OP_breg31 <offset>
      • 将给定存放器的内容加上给定的偏移量压入客栈
  • 客栈操作
    • DW_OP_dup
      • 复制客栈顶部的值
    • DW_OP_deref
      • 将客栈顶部视为内存地址,并将其调换为该地址的内容
  • 算术和逻辑运算
    • DW_OP_and
      • 弹出客栈顶部的两个值,并压回它们的逻辑 AND
    • DW_OP_plus
      • 与 DW_OP_and 雷同,然则会添加值
  • 控制流操作
    • DW_OP_le、DW_OP_eq、DW_OP_gt 等
      • 弹出前两个值,比较它们,并且如不雅前提为真,则压入 1,不然为 0
    • DW_OP_bra <offset>
      • 前提分支:如不雅客栈的顶部不是 0,则经由过程 offset 在表达式中向后或向后跳过
  • 输入转化
    • DW_OP_convert <DIE offset>
      • 将客栈顶部的值转换为不合的类型,它由给定偏移量的 DWARF 信息条目描述
  • 特别操作
    • DW_OP_nop
      • 什么都不做!

DWARF 类型

DWARF 类型的表示须要足够强大年夜来为调试器用户供给有效的变量表示。用户经常欲望可以或许在应用法度榜样级别进行调试,而不是在机械级别进行调试,并且他们须要懂得他们的变量正在做什么。

DWARF 类型与大年夜多半其他调试信息一路编码在 DIE 中。它们可以具有指导其名称、编码、大年夜小、字节等的属性。无数的类型标签可用于表示指针、数组、构造体、typedef 以及 C 或 C++ 法度榜样中可以看到的任何其他内容。

  1. struct test{ 
  2.     int i; 
  3.     float j; 
  4.     int k[42]; 
  5.     test* next
  6. }; 
  7.  1/6    1 2 3 4 5 6 下一页 尾页

      推荐阅读

      可能是国内最火的开源项目 —— HTML/CSS 篇

    截止今朝开源中国收录了 44513 款开源项目,囊括了最热点的各类开源项目,而软件的评分在必定程度上代表了软件的质量和热度,而重要用 HTML/CSS 编写的项目中也有很多值得救鉴的处所,是以>>>详细阅读


    本文标题:开发一个Linux调试器(九):处理变量

    地址:http://www.17bianji.com/lsqh/37722.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)