Library to read ELF file DWARF debug information

后端 未结 4 399
被撕碎了的回忆
被撕碎了的回忆 2020-12-05 13:55

Any recommendations for a good cross-platform library for reading ELF file debug information in DWARF format? I\'d like to read the DWARF debug info in a Python program.

相关标签:
4条回答
  • 2020-12-05 14:35

    The concept of "ELF debug info" doesn't really exist: the ELF specification leaves the content of the .debug section deliberately unspecified.

    Common debug formats are STAB and DWARF. A library to read DWARF is libdwarf.

    0 讨论(0)
  • 2020-12-05 14:38

    There's a new kid on the block - pyelftools - a pure Python library for parsing the ELF and DWARF formats. Give it a try.

    It aims to be feature-complete and is currently in active development, so any problems should be handled quickly and enthusiastically :-)

    0 讨论(0)
  • 2020-12-05 14:41

    Your options for reading the DWARF debugging information are unfortunately quite limited.

    As far as I know there is only one general purpose library for parsing DWARF debugging information and that is libdwarf. Unfortunately no one has written Python bindings for libdwarf (maybe you could take it up upon yourself and share it with everyone else :) ) You could certainly attempt to access the library's functions using ctypes or the Python C API.

    A much less elegant solution, however, is to use an existing DWARF parser and parse the textual information it outputs. Your options for this (on Linux) are

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

    I currently use a project that builds off of readelf and it's support for the DWARF debugging information is very full featured. You could simply use Python to execute either command in the shell and then parse the information as you need. Certainly not as ideal as a library, but should do the trick.

    EDIT: I noticed in a previous comment you mentioned Windows. Both of these programs(objdump and readelf) are part of GNU-binutils, so they should be available with Cygwin or mingw.

    0 讨论(0)
  • 2020-12-05 14:43

    You might be interested in the DWARF library from pydevtools:

    >>> 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
    [...]
    
    0 讨论(0)
提交回复
热议问题