解析DWARF的高效方式
Efficient way to parse DWARF
我尝试构建一个允许我在函数或代码行处设置断点的调试器。所需的调试信息应该从 elf 文件的 DWARF 部分中提取。我能够提取这些数据。我要调试的项目有 50-100 个文件,所以我需要大约 10 分钟的时间来使用 readelf 或 pyelftools 解析 elf 以获得我需要的所有矮人信息。
为了提高速度,我的下一个方法是只解析当前打开的源文件的调试信息。但是使用 pyelftools 也需要几分钟。
调试器如何快速获取信息?我将 iSystem 调试器与 winIDEA 一起使用,大约需要 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
How do debuggers get the informations so fast?
通过阅读仅他们需要的信息(DWARF
格式的结构使得您可以有效地跳过您不感兴趣的翻译单元和功能),并且通过在 C
.
中进行
I need about 10 min to parse the elf with readelf or pyelftools
这可能是您问题的重要部分:解析 readelf
输出的效率可能比直接读取信息低 100 到 1000 倍。
pyelftools
确实提供了一个 API 来迭代编译单元,理论上应该能够提供有效的访问。
你没有展示你是如何使用它的,你可能没有有效地使用它。
即便如此,pyelftools
是在纯 Python 中实现的,因此可能至少比 libdwarf
.
慢 10 倍
我尝试构建一个允许我在函数或代码行处设置断点的调试器。所需的调试信息应该从 elf 文件的 DWARF 部分中提取。我能够提取这些数据。我要调试的项目有 50-100 个文件,所以我需要大约 10 分钟的时间来使用 readelf 或 pyelftools 解析 elf 以获得我需要的所有矮人信息。 为了提高速度,我的下一个方法是只解析当前打开的源文件的调试信息。但是使用 pyelftools 也需要几分钟。
调试器如何快速获取信息?我将 iSystem 调试器与 winIDEA 一起使用,大约需要 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
How do debuggers get the informations so fast?
通过阅读仅他们需要的信息(DWARF
格式的结构使得您可以有效地跳过您不感兴趣的翻译单元和功能),并且通过在 C
.
I need about 10 min to parse the elf with readelf or pyelftools
这可能是您问题的重要部分:解析 readelf
输出的效率可能比直接读取信息低 100 到 1000 倍。
pyelftools
确实提供了一个 API 来迭代编译单元,理论上应该能够提供有效的访问。
你没有展示你是如何使用它的,你可能没有有效地使用它。
即便如此,pyelftools
是在纯 Python 中实现的,因此可能至少比 libdwarf
.