使用LLDB API获取用ARMGCC编译的elf文件中表达式的地址

2024-05-28 19:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个在.cpp文件中具有嵌套结构的ARM.elf文件,我可以使用LLDB计算表达式以获得全局结构/数组元素的地址

lldb my_arm.elf
(lldb) ex &user_data.sub_type[2].i[3]

这就得到了预期的结果,

(int *) $1 = 0x200001f0

…类似于gdb,为C/C++结构元素指定了类型、索引和RAM中的地址。LLDB还可以计算像“&;这样的表达式;“主要”、“1+1”等

尝试在lldb API中使用EvaluateExpression()在python中执行相同的操作,总是会导致错误!IsValid()

import lldb  # this works in python in linux.
dbg = lldb.SBDebugger().Create()
dbg.SetAsync(False)
modspec = lldb.SBModuleSpec()
modspec.SetFileSpec(lldb.SBFileSpec("my_arm.elf"))
modspec.SetSymbolFileSpec(lldb.SBFileSpec("my_arm.elf"))
target.AddModule(modspec)  # target.IsValid() is True.
val=target.EvaluateExpression('&user_data.sub_type[2].i[3]')

这是lldb外部的pythonval.IsValid()始终为False,我似乎无法从表达式中获取值。更琐碎的表达,如“&;“main”和“1+1”给出了类似的结果

如何使用lldb API计算.elf文件的表达式


Tags: 文件元素targetdata表达式my地址结构
1条回答
网友
1楼 · 发布于 2024-05-28 19:36:58

如此接近。程序的这种简化提供了所需的结果

import lldb
dbg = lldb.SBDebugger().Create()
target = dbg.CreateTarget("my_arm.elf")
val = target.EvaluateExpression("&user_data.sub_type[2].i[3]")
print("'{0}', type={1}, name={2}, value={3}, result={4}".format(val, val.type, val.name, val.value, val.GetError()))

结果是:

'(int *) $0 = 0x200001f0', type=int *, name=$0, value=0x200001f0, result=success

…这与gdb给出的结果类似,但有更多关于表达式值的信息,并且使用lldb库在过程中快速完成

相关问题 更多 >

    热门问题