作家
登录

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

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

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

到今朝为止,你已经有时听到了关于 dwarves、调试信息、一种无需解析就可以懂得源码方法。今天我们会具体介绍源码级的调试信息,作为本指南后面部分应用它的预备。

系列文┞仿索引

ELF 和 DWARF 简介

ELF 和 DWARF 可能是两个你没有据说过,但可能大年夜部分时光都在应用的组件。ELF(Executable and Linkable Format,可履行和可链接格局)是 Linux 体系中应用最广泛的目标文件格局;它指定了一种存储二进制文件的所有不合部分的方法,例如代码、静态数据、调试信息以及字符串。它还告诉加载器若何加载二进制文件并预备履行,个中包含解释二进制文件不合部分在内存中应当放置的地点,哪些位须要根据其它组件的地位固定(重分派)以及其它。在这些博文中我不会用太多篇幅介绍 ELF,然则如不雅你感兴趣的话,你可以查看这个很好的信息图或该标准。

DWARF是平日和 ELF 一路应用的调试信息格局。它不必定要绑定到 ELF,但它们两者是一路成长的,一路工作得很好。这种格局许可编译器告诉调试器最初的源代码若何和被履行的二进制文件相接洽关系。这些信息分散到不合的 ELF 部分,每个部分都连接有一份它本身的信息。下面不合部分的定义,信息取自这个稍有过时但异常重要的 DWARF 调试格局简介:

  • .debug_abbrev .debug_info 部分应用的缩略语
  • .debug_aranges 内存地址和编译的映射
  • .debug_frame 调用帧信息
  • .debug_info 包含 DWARF 信息条目(DWARF Information Entries)(DIEs)的核心 DWARF 数据
  • .debug_line 行号法度榜样
  • .debug_loc 地位描述
  • .debug_macinfo 宏描述
  • .debug_pubnames 全局对象和函数查找表
  • .debug_pubtypes 全局类型查找表
  • .debug_ranges DIEs 的引用地址范围
  • .debug_str .debug_info 应用的字符串列表
  • .debug_types 类型描述

我们最关怀的是 .debug_line 和 .debug_info 部分,让我们来看一个简单法度榜样的 DWARF 信息。

DWARF 行表

如不雅你用 -g 选项编译这个法度榜样,然后将结不雅传递给 dwarfdump 履行,在行号部分你应当可以看到类似如许的器械:

  1. .debug_line: line number info for a single cu 
  2. Source lines (from CU-DIE at .debug_info offset 0x0000000b): 
  3.             NS new statement, BB new basic block, ET end of text sequence 
  4.             PE prologue end, EB epilogue begin 
  5.             IS=val ISA number, DI=val discriminator value 
  6. <pc>        [lno,col] NS BB ET PE EB IS= DI= uri: "filepath" 
  7. 0x00400670  [   1, 0] NS uri: "/home/simon/play/MiniDbg/examples/variable.cpp" 
  8. 0x00400676  [   2,10] NS PE 
  9. 0x0040067e  [   3,10] NS 
  10. 0x00400686  [   4,14] NS 
  11. 0x0040068a  [   4,16] 
  12. 0x0040068e  [   4,10] 
  13. 0x00400692  [   5, 7] NS 
  14. 0x0040069a  [   6, 1] NS 
  15. 0x0040069c  [   6, 1] NS ET 

前面几行是一些若何懂得 dump 的信息 - 重要的行号数据大年夜以 0x00400670 开首的行开端。实际上这是一个代码内存地址到文件中行列号的映射。NS 表示地址标记一个新语句的开端,这平日用于设置断点或慢慢履行。PE 表示函数序言(LCTT 译注:在汇编说话中,function prologue 是法度榜样开端的几行代码,用于预备函数顶用到的┞坊和存放器)的停止,这对于设置函数断点异常有赞助。ET 表示转换单元的停止。信息实际上并不像如许编码;真正的编码是一种异常节俭空间的排序法度榜样,可以经由过程履行它来建立这些行信息。

 1/7    1 2 3 4 5 6 下一页 尾页

  推荐阅读

  代码处理iOS的横竖屏旋转

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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