web-dev-qa-db-ja.com

ELFファイルを読み取るためのライブラリDWARFデバッグ情報

ELFファイルのデバッグ情報をDWARF形式で読み取るための優れたクロスプラットフォームライブラリに関する推奨事項はありますか? PythonプログラムでDWARFデバッグ情報を読みたいのですが。

21
Craig McQueen

ブロックに新しい子供がいます- pyelftools --ELFおよびDWARF形式を解析するための純粋なPythonライブラリ。試してみてください。

機能が完全であることを目指しており、現在活発に開発されているため、問題が発生した場合は迅速かつ熱心に対処する必要があります:-)

26
Eli Bendersky

「ELFデバッグ情報」の概念は実際には存在しません。ELF仕様では、.debugセクションの内容が意図的に指定されていません。

一般的なデバッグ形式は、STABおよび [〜#〜] dwarf [〜#〜] です。 DWARFを読み取るライブラリは libdwarf です。

11

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
[...]
7
emilmont

DWARFデバッグ情報を読み取るためのオプションは、残念ながら非常に限られています。

私の知る限り、DWARFデバッグ情報を解析するための汎用ライブラリは1つだけで、それは libdwarf です。残念ながら、誰もlibdwarfのPythonバインディングを書いていません(多分あなたはそれを自分で取り上げて他のみんなと共有することができます:))あなたは確かに を使用してライブラリの関数にアクセスしようとすることができますctypes または Python C API

ただし、あまり洗練されていない解決策は、既存のDWARFパーサーを使用して、出力されるテキスト情報を解析することです。これに対するオプション(Linuxの場合)は次のとおりです。

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

私は現在、readelfから構築されたプロジェクトを使用しており、DWARFデバッグ情報のサポートは非​​常に充実しています。 Pythonを使用して、シェルでいずれかのコマンドを実行し、必要に応じて情報を解析することができます。確かにライブラリほど理想的ではありませんが、うまくいくはずです。

編集:あなたがWindowsについて言及した以前のコメントで気づきました。これらのプログラム(objdumpとreadelf)は両方ともGNU-binutilsの一部であるため、Cygwinまたはmingwで使用できるはずです。

4
Falaina