我试图构建一个调试器,它允许我在函数或代码行上设置断点。所需的调试信息应该从精灵文件中的侏儒部分中提取。我能提取这些数据。我想要调试的项目有50-100个文件,所以我需要大约10分钟的时间来解析精灵,用readelf或pyelftools来处理我需要的所有矮人信息。为了提高速度,我的下一个方法是只解析当前开放源文件的调试信息。但使用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发布于 2020-10-08 02:25:16
调试器是如何如此快速地获取信息的?
通过只读取他们需要的信息(DWARF格式的结构使得您可以有效地跳过您不感兴趣的翻译单元和函数),并在C中完成它。
,我需要大约10分钟的时间来解析精灵,用可读的工具或pyelftools。
这可能是问题的重要部分:解析readelf输出可能比直接读取信息效率低100到1000倍。
pyelftools似乎确实提供了一个在编译单元上迭代的API,理论上应该能够提供高效的访问。
你没有展示你是如何使用它的,你可能没有高效地使用它。
即使如此,pyelftools也是用纯Python实现的,因此很可能至少比libdwarf之类的东西慢10倍。
https://stackoverflow.com/questions/64238017
复制相似问题