作家
登录

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

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

  1. for each compile unit: 
  2.     if the pc is between DW_AT_low_pc and DW_AT_high_pc: 
  3.         for each function in the compile unit: 
  4.             if the pc is between DW_AT_low_pc and DW_AT_high_pc: 
  5.                 return function information 
  1. int main() { 
  2.     long a = 3; 
  3.     long b = 2; 
  4.     long c = a + b; 
  5.     a = 4; 

这对于很多目标都有效,但如不雅有成员函数或者内联(inline),就会变得加倍复杂。假如有内联,一旦我们找到其范围包含我们的法度榜样计数器(PC)的函数,我们须要递归遍历该 DIE 的所有孩子检查有没有内联函数能更好地匹配。在我的代铝闼楝我不会为该调试器处理内联,但如不雅你想要的话你可以添加该功能。

如安在一个函数上设置断点?

再次解释,这取决于你是否想要支撑成员函数、定名空间以及类似的器械。对于简单的函数你只须要迭代遍历不合编译单位中的函数直到你找到一个合适的名字。如不雅你的编译器可以或许填充 .debug_pubnames 部分,你可以更高效地做到这点。

一旦找到了函数,你可以在 DW_AT_low_pc 给定的内存地址设置一个断点。不过那会在函数序言处中断,但更合适的是在用户代码处中断。因为行表信息可以指定序言的停止的内存地址,你只须要在行表中查找 DW_AT_low_pc 的值,然后一向攫取直到被标记为序言停止的条目。一些编译器不会输出这些信息,是以另一种方法是在该函数第二行条目指定的地址处设置断点。

假如我们想在我们示例法度榜样中的 main 函数设置断点。我们查找名为 main 的函数,获取到它的 DIE:

这告诉我们该类型是 8 字节(64 位)有符号整型,是以我们可以持续并把这些字节解析为 int64_t 并向用户显示。

  1. < 1><0x0000002e>    DW_TAG_subprogram 
  2.                       DW_AT_low_pc                0x00400670 
  3.                       DW_AT_high_pc               0x0040069c 
  4.                       DW_AT_frame_base            DW_OP_reg6 
  5.                       DW_AT_name                  main 
  6.                       DW_AT_decl_file             0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp 
  7.                       DW_AT_decl_line             0x00000001 
  8.                       DW_AT_type                  <0x00000077> 

      推荐阅读

      代码处理iOS的横竖屏旋转

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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