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