【问题标题】:Efficient way to parse DWARF解析 DWARF 的有效方法
【发布时间】:2021-01-22 01:18:15
【问题描述】:

我尝试构建一个调试器,它允许我在函数或代码行处设置断点。所需的调试信息应从 elf 文件的 DWARF 部分中提取。我能够提取这些数据。我要调试的项目有 50-100 个文件,所以我需要大约 10 分钟来使用 readelf 或 pyelftools 解析 elf 以获得我需要的所有 dwarf 信息。 为了提高速度,我的下一个方法是只解析当前打开的源文件的调试信息。但是使用 pyelftools 也需要几分钟。

调试器如何如此快速地获取信息?我使用带有 winIDEA 的 iSystem 调试器,大约需要 20 秒。刷新精灵,然后我可以立即在任何源文件中设置断点。

我是该主题的新手,因此不胜感激。

编辑:这就是我使用 pyelftools 从一个文件中获取函数地址的方式

def main():
  dwarfinfo = elffile.get_dwarf_info()

  for CU in dwarfinfo.iter_CUs():
    top_DIE = CU.get_top_DIE()

    if FILENAME in top_DIE.get_full_path():
      die_info_rec(top_DIE)
      return

def die_info_rec(die):
  if "subprogram" in die.tag:
    # Function found, get data
    return

【问题讨论】:

  • 50-100 个文件并不多,我不希望解析 elf 文件需要 10 分钟(除非这些文件非常大)。调试信息的大小是多少?
  • elf文件总大小为38MB。当我为 debug_info 运行 elfread 时,它显示长度:0x6a2b2(32 位)。不知道是不是这个尺寸。
  • 调试器不会立即解码所有调试信息,只解码他们需要的部分。

标签: debugging elf dwarf readelf pyelftools


【解决方案1】:

调试器如何如此快速地获取信息?

通过只阅读他们需要的信息(DWARF 格式的结构使您可以有效地跳过您不感兴趣的翻译单元和功能),并通过在 C 中进行操作.

我需要大约 10 分钟来用 readelf 或 pyelftools 解析精灵

这可能是您问题的重要部分:解析readelf 输出的效率可能比直接读取信息低 100 到 1000 倍。

pyelftools 似乎确实提供了一个 API 来迭代编译单元,理论上应该能够提供有效的访问。

你没有展示你是如何使用它的,你可能没有有效地做到这一点。

即便如此,pyelftools 是在纯 Python 中实现的,因此可能至少比 libdwarf 慢 10 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2011-08-22
    • 2018-12-31
    • 1970-01-01
    • 2020-11-26
    • 2019-03-11
    相关资源
    最近更新 更多