Debugging 如何使用pyelftools/libdwarf找到一行代码

Debugging 如何使用pyelftools/libdwarf找到一行代码,debugging,elf,dwarf,pyelftools,Debugging,Elf,Dwarf,Pyelftools,我有一个函数名和该函数顶部的偏移量。我知道我可以通过查看程序集列表文件找到代码行,并计算代码行的偏移量,然后通过这种方式获得行号 我试图做的是使用.o文件来获取相同的信息。我可以看到ELF文件的DWARF信息,可以在DWARF数据中找到函数的DIE for,但是我如何实际看到该函数指令的信息并将其映射到一行代码。我一直在使用pyelftools,所以我希望能够使用它,但如果我不能使用pyelftools,我愿意接受其他选项。pyelftools中有一个示例可以做到这一点: 具体来说,查找地址行的

我有一个函数名和该函数顶部的偏移量。我知道我可以通过查看程序集列表文件找到代码行,并计算代码行的偏移量,然后通过这种方式获得行号


我试图做的是使用.o文件来获取相同的信息。我可以看到ELF文件的DWARF信息,可以在DWARF数据中找到函数的DIE for,但是我如何实际看到该函数指令的信息并将其映射到一行代码。我一直在使用pyelftools,所以我希望能够使用它,但如果我不能使用pyelftools,我愿意接受其他选项。

pyelftools中有一个示例可以做到这一点:

具体来说,查找地址行的过程如下:

def decode_file_line(dwarfinfo, address):
    # Go over all the line programs in the DWARF information, looking for
    # one that describes the given address.
    for CU in dwarfinfo.iter_CUs():
        # First, look at line programs to find the file/line for the address
        lineprog = dwarfinfo.line_program_for_CU(CU)
        prevstate = None
        for entry in lineprog.get_entries():
            # We're interested in those entries where a new state is assigned
            if entry.state is None:
                continue
            if entry.state.end_sequence:
                # if the line number sequence ends, clear prevstate.
                prevstate = None
                continue
            # Looking for a range of addresses in two consecutive states that
            # contain the required address.
            if prevstate and prevstate.address <= address < entry.state.address:
                filename = lineprog['file_entry'][prevstate.file - 1].name
                line = prevstate.line
                return filename, line
            prevstate = entry.state
    return None, None
def解码文件行(dwarfinfo,地址):
#检查DWARF信息中的所有行程序,查找
#描述给定地址的人。
对于dwarfinfo.iter_CUs()中的CU:
#首先,查看行程序以查找地址的文件/行
lineprog=dwarfinfo.line\u程序
prevstate=无
对于lineprog.get_entries()中的条目:
#我们对那些分配了新状态的条目感兴趣
如果entry.state为None:
持续
如果entry.state.end\u序列:
#如果行号序列结束,请清除prevstate。
prevstate=无
持续
#在两个连续状态中查找地址范围
#包含所需的地址。
如果是prevstate和prevstate.address