读取ELF文件中DWARF调试信息的库

26

有没有推荐一个跨平台的库,可以读取DWAF格式的ELF文件调试信息?我想在Python程序中读取DWARF调试信息。


您可能会在这里找到有用的信息:- [David A的DWARF页面](http://reality.sgiweb.org/davea/dwarf.html)- [SO问题](https://dev59.com/-HVD5IYBdhLWcg3wOo9h) - Nick Dandoulakis
4个回答

31

街头出现了新的人物 - pyelftools - 一个用纯 Python 编写的解析 ELF 和 DWARF 格式的库。赶快试试吧。

它的目标是实现功能的完备性,目前正在积极开发中,因此任何问题都应该能够被快速、热情地处理 :-)


1
通过 filebytes 的一些帮助,它也可以处理 MachO(MacOS/iOS)可执行文件。可能也适用于 PE,但我还没有尝试过。 - Seva Alekseyev
UPD:也适用于PE,尽管带有DWARF的PE是罕见的组合。 - Seva Alekseyev

12

"ELF调试信息"的概念并不存在:ELF规范有意保留了.debug部分的内容未指定。

常见的调试格式为STAB和DWARF。一个用于读取DWARF的库是libdwarf


1
libdwarf是跨平台的吗,你知道吗?页面上没有说明,但似乎总体上具有Unix风格。 - Craig McQueen
我还没有尝试过移植它。它似乎有一些Unix特定的东西(例如在darfdump可执行文件中);它也基于libelf。然而,将其移植到不同的系统应该是很简单的。 - Martin v. Löwis
我已经使用libdwarf做了一些小工作。它在C标准库之外的依赖是libelf,目前可用于Windows。在Cygwin中为Windows编译它应该是一个相当(根据“相当”的定义)容易的任务。 - Falaina
3
我已经成功将libdwarf移植到windows系统,并使用visual studio 2008进行编译。 - Torleif
@Torleif 你好,既然你已经成功地移植了libdwarf,能否看一下我的帖子并给我一些指导?https://dev59.com/F1DTa4cB1Zd3GeqPGBOb - greatwolf
2
@Torleif,你能分享一下你移植的版本吗?那会帮助很多人! - buc030

7

您可能对来自pydevtools的DWARF库感兴趣:

>>> from devtools.dwarf import DWARF
>>> dwarf = DWARF('test/test')
>>> dwarf.get_loc_by_addr(0x8048475)
('/home/emilmont/Workspace/dbg/test/main.c', 36, 0)
>>> print dwarf
.debug_info
COMPILE_UNIT<header overall offset = 0>
<0><11> compile_unit
producer: GNU C 4.4.3
language: C89
name: a/test.c
comp_dir: /home/emilmont/Workspace/dbg/test
low_pc: 0x080483e4
high_pc: 0x08048410
stmt_list: 0
[...]

太好了,知道了。有几个问题:1)支持哪些平台(Windows、Linux)?2)能否将其放在PyPI上? - Craig McQueen
太好了!文档里没有提到支持的平台。它能在Windows上运行吗? - Craig McQueen
我已经查看了它,它无法读取我的ELF文件(来自GCC编译器针对嵌入式ARM的目标)。我猜这是部分实现。我应该向您提交样本ELF文件吗? - Craig McQueen

5

很遗憾,解析DWARF调试信息的选项非常有限。

据我所知,只有一个通用库可用于解析DWARF调试信息,即libdwarf。不幸的是,没有人为libdwarf编写Python绑定(也许你可以自己尝试,并与其他人分享 :) )。您可以尝试使用ctypesPython C API来访问库的函数。

然而,一种更不太优雅的解决方案是使用现有的DWARF解析器并解析其输出的文本信息。在Linux上,您可以选择以下选项:

objdump -W
readelf --debug-dump=[OPTIONS]

我目前使用的项目是基于readelf构建的,它对DWARF调试信息的支持非常全面。你可以简单地使用Python在shell中执行任一命令,然后按需解析信息。虽然不如库理想,但应该可行。

编辑:我注意到您在之前的评论中提到了Windows。这两个程序(objdump和readelf)都是GNU-binutils的一部分,因此它们应该在Cygwin或mingw中可用。


1
还有dwarfdump - hochl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接