作家
登录

开发一个Linux调试器(四):Elves和dwarves

作者: 来源: 2017-07-25 13:43:22 阅读 我要评论

  •                       DW_AT_external              yes(1) 
  • 这告诉我们函数大年夜 0x00400670 开端。如不雅我们在行表中查找这个,我们可以获得条目:

    1. 0x00400670  [   1, 0] NS uri: "/super/secret/path/MiniDbg/examples/variable.cpp" 

    我们欲望跳过序言,是以我们再攫取一个条目:

    1. 0x00400676 [ 2,10] NS PE 

    Clang 在这个条目中包含了序言停止标记,是以我们知道在这里停止,然后在地址 0x00400676 处设一个断点。

    我若何攫取一个变量的内容?

    歇息一会

    攫取变量可能异常复杂。它们是难以捉摸的器械,可能在全部函数中移动、保存在存放器中、被放置于内存、被优化掉落、隐蔽在角落里,等等。荣幸的是我们的简单示例是真的很简单。如不雅我们想攫取变量 a 的内容,我们须要看它的 DW_AT_location 属性:

    1. DW_AT_location DW_OP_fbreg -8 

    这告诉我们内容被保存在以栈帧基(base of the stack frame)偏移为 -8 的处所。为了找到栈帧基,我们查找地点函数的 DW_AT_frame_base 属性。

    1. DW_AT_frame_base DW_OP_reg6 

    大年夜 System V x86_64 ABI 我们可以知道 reg6 在 x86 中是帧指针存放器。如今我们攫取帧指针的内容,大年夜中减去 8,就找到了我们的变量。如不雅我们知道它具体是什么,我们还须要看它的类型:

    1. < 2><0x0000004c>      DW_TAG_variable 
    2.                         DW_AT_name                  a 
    3.                         DW_AT_type                  <0x0000007e> 

    如不雅我们在调试信息中查找该类型,我们获得下面的 DIE:

    1. < 1><0x0000007e>    DW_TAG_base_type 
    2.                       DW_AT_name                  long int 
    3.                       DW_AT_encoding              DW_ATE_signed 
    4.                       DW_AT_byte_size             0x00000008 

    当然,类许可能比那要复杂得多,因为它们要可以或许表示类似 C++ 的类型,然则这能给你它们若何工作的根本熟悉。

    跟着后面文┞仿的宣布,这些链接会逐渐生效。

    1. 预备情况
    2. 断点
    3. 存放器和内存
    4. Elves 和 dwarves
    5. 源码和旌旗灯号
    6. 源码级慢慢履行
    7. 源码级断点
    8. 调用栈展开
    9. 攫取变量
    10. 下一步

    再次回到帧基(frame base),Clang 可以经由过程帧指针存放器跟踪帧基。比来版本的 GCC 偏向于应用 DW_OP_call_frame_cfa,它包含解析 .eh_frame ELF 部分,那是一个我不会去写的别的一篇完全不呵9依υ?┞仿。如不雅你告诉 GCC 应用 DWARF 2 而不是比来的版本,它会偏向于输出地位列表,这更便于浏览:

    1. DW_AT_frame_base            <loclist at offset 0x00000000 with 4 entries follows> 
    2.  low-off : 0x00000000 addr  0x00400696 high-off  0x00000001 addr 0x00400697>DW_OP_breg7+8 

        推荐阅读

        代码处理iOS的横竖屏旋转

      以上具体源码参考:QSRotationScreenDemo在处理iOS反正屏时,经常会和UIDeviceOrientation、UIInterfaceOrientation和UIInterfaceOrientationMask这三个列举类型打交道,它们大年夜不合角>>>详细阅读


      本文标题:开发一个Linux调试器(四):Elves和dwarves

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

    关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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