这告诉我们函数大年夜 0x00400670 开端。如不雅我们在行表中查找这个,我们可以获得条目:
- 0x00400670 [ 1, 0] NS uri: "/super/secret/path/MiniDbg/examples/variable.cpp"
我们欲望跳过序言,是以我们再攫取一个条目:
- 0x00400676 [ 2,10] NS PE
Clang 在这个条目中包含了序言停止标记,是以我们知道在这里停止,然后在地址 0x00400676 处设一个断点。
我若何攫取一个变量的内容?
歇息一会
攫取变量可能异常复杂。它们是难以捉摸的器械,可能在全部函数中移动、保存在存放器中、被放置于内存、被优化掉落、隐蔽在角落里,等等。荣幸的是我们的简单示例是真的很简单。如不雅我们想攫取变量 a 的内容,我们须要看它的 DW_AT_location 属性:
- DW_AT_location DW_OP_fbreg -8
这告诉我们内容被保存在以栈帧基(base of the stack frame)偏移为 -8 的处所。为了找到栈帧基,我们查找地点函数的 DW_AT_frame_base 属性。
- DW_AT_frame_base DW_OP_reg6
大年夜 System V x86_64 ABI 我们可以知道 reg6 在 x86 中是帧指针存放器。如今我们攫取帧指针的内容,大年夜中减去 8,就找到了我们的变量。如不雅我们知道它具体是什么,我们还须要看它的类型:
- < 2><0x0000004c> DW_TAG_variable
- DW_AT_name a
- DW_AT_type <0x0000007e>
如不雅我们在调试信息中查找该类型,我们获得下面的 DIE:
- < 1><0x0000007e> DW_TAG_base_type
- DW_AT_name long int
- DW_AT_encoding DW_ATE_signed
- DW_AT_byte_size 0x00000008
当然,类许可能比那要复杂得多,因为它们要可以或许表示类似 C++ 的类型,然则这能给你它们若何工作的根本熟悉。
跟着后面文┞仿的宣布,这些链接会逐渐生效。
- 预备情况
- 断点
- 存放器和内存
- Elves 和 dwarves
- 源码和旌旗灯号
- 源码级慢慢履行
- 源码级断点
- 调用栈展开
- 攫取变量
- 下一步
再次回到帧基(frame base),Clang 可以经由过程帧指针存放器跟踪帧基。比来版本的 GCC 偏向于应用 DW_OP_call_frame_cfa,它包含解析 .eh_frame ELF 部分,那是一个我不会去写的别的一篇完全不呵9依υ?┞仿。如不雅你告诉 GCC 应用 DWARF 2 而不是比来的版本,它会偏向于输出地位列表,这更便于浏览:
- DW_AT_frame_base <loclist at offset 0x00000000 with 4 entries follows>
- low-off : 0x00000000 addr 0x00400696 high-off 0x00000001 addr 0x00400697>DW_OP_breg7+8
推荐阅读
以上具体源码参考:QSRotationScreenDemo在处理iOS反正屏时,经常会和UIDeviceOrientation、UIInterfaceOrientation和UIInterfaceOrientationMask这三个列举类型打交道,它们大年夜不合角>>>详细阅读
本文标题:开发一个Linux调试器(四):Elves和dwarves
地址:http://www.17bianji.com/lsqh/36389.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示