虽然LLDB的Python API看起来非常强大,但开始时有点困难。具体来说,我正在寻找一种从给定的内存地址读取N个字节的方法。我想我可以使用lldb.SBValue.CreateValueFromAddress
方法完成此操作,该方法映射到:
SBValue_CreateValueFromAddress(SBValue self, char const * name, lldb::addr_t address, SBType type) -> SBValue
不幸的是,我无法从参考文档中找出要传递的参数及其含义。另一种方法是创建一个lldb.SBAddress
,但我再次陷入困境,因为我不清楚__init__
所需的论据。
问题:如何使用LLDB的Python API从给定的内存地址读取N个字节?关于这个主题的好阅读材料也是最受欢迎的。
提前致谢。
答案 0 :(得分:1)
您应该使用SBProcess.ReadMemory
。
def my_command(debugger, command, result, internal_dict):
my_address = 0xdeadbeef # change for some real address
my_data_size = 0x1000 # change for some real memory size
error_ref = lldb.SBError()
process = debugger.GetSelectedTarget().GetProcess()
memory = process.ReadMemory(my_address, my_data_size, error_ref)
if error_ref.Success():
# `memory` is a regular byte string
else:
result.AppendString(str(error_ref))
如果发生错误, ReadMemory
会修改error_ref
。
答案 1 :(得分:0)
在当前Frame对象上使用EvaluateExpression
可以解决问题。例如:
debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetFrameAtIndex(0).EvaluateExpression(*(int*)(0x0000000100400000)).GetValue()
基于此answer。
答案 2 :(得分:0)
这是Rust的LLDB格式化程序的一个例子:
element_type_size = element_type.GetByteSize() def render_element(i): address = start_address + i * element_type_size element_val = raw_value.CreateValueFromAddress(array_name + ("[%s]" % i), address, element_type)
这是索引到所有相同类型的连续内存数组。名称param似乎是调试器可以用来向用户显示的标签,但与显示的实际值无关(即,您可以将其设置为任何内容并且它应该工作)。
唉,我还没弄清楚如何从头开始创造最终的论点。