LLDB Python API SBAddress 构造函数错误
LLDB Python API SBAddress constructor error
我正在尝试从我拥有的地址值创建 SB 值,但我 运行遇到了 SBAddress 构造函数的问题。当我这样做时:
target = lldb.debugger.GetSelectedTarget()
pointer = target.FindFirstType('node_t').GetPointerType()
root = target.CreateValueFromAddress('root', lldb.SBAddress(0x100004058, target), pointer)
然后我运行
root.GetValue()
我得到类似 0x0000000100004041 的信息
我在这里使用 SBAddress 的构造函数有什么问题吗?
你必须注意什么指向什么才能正确。 0x100004058 是您要从中创建类型的指针的值,还是该指针的位置?我怀疑是前者...
作为指针值的地址处的内存保存着一个“node_t”类型的对象。所以当你想从那个内存中创建一个 SBValue 时,你想要的类型是“node_t”而不是“node_t *”。
但是,如果 0x100004058 是指针的位置,那么在该地址处将值作为指向 node_t 的指针是正确的。
所以,例如,停在这里:
* thread #1: tid = 0x4ae2e3, function: take_void , stop reason = breakpoint 1.1
frame #0: 0x0000000100000f33 pointers`take_void at pointers.c:12
9 void
10 take_void(void *input)
11 {
-> 12 printf("Got pointer: %p.\n", input);
13 }
14
15 int
呼叫方:
15 int
16 main()
17 {
18 struct Foo my_foo = {111, 222};
19 take_void (&my_foo);
20 return 0;
21 }
然后:
(lldb) fr v -L
0x00007fff5fbff658: (void *) input = 0x00007fff5fbff670
首地址为输入位置,所以:
(lldb) script
>>> ptr_type = lldb.target.FindFirstType('Foo').GetPointerType()
>>> root = lldb.target.CreateValueFromAddress("root", lldb.SBAddress(0x00007fff5fbff658, lldb.target), ptr_type)
>>> root.GetValue()
'0x00007fff5fbff670'
这是您所期望的。并且:
>>> root = lldb.target.CreateValueFromAddress("root", lldb.SBAddress(0x00007fff5fbff670, lldb.target), type)
>>> root.GetValue()
没错,因为结构没有值。并且:
>>> root.GetChildAtIndex(0).GetValue()
'111'
>>> root.GetChildAtIndex(1).GetValue()
'222'
这些是我在字段中输入的值,所以这是正确的。并且:
>>> root = lldb.target.CreateValueFromAddress("root", lldb.SBAddress(0x00007fff5fbff670, lldb.target), ptr_type)
>>> root.GetValue()
'0x000000de0000006f'
(这可能是你犯的错误)也有道理,因为 0xde 是 222 而 0x6f 是 111 而且我在小端系统上......
我正在使用 SBValue
自己的 CreateValueFromAddress
方法。它没有很好地记录,但我已经弄清楚了参数并且它们比目标的更简单。像这样使用它(不需要特殊的地址函数,只需简单的 + 运算符):
offset_in_bytes = base_address + some_offset
some_other_sbvalue.CreateValueFromAddress("name-of-new-value", offset_in_bytes, value_type)
我正在尝试从我拥有的地址值创建 SB 值,但我 运行遇到了 SBAddress 构造函数的问题。当我这样做时:
target = lldb.debugger.GetSelectedTarget()
pointer = target.FindFirstType('node_t').GetPointerType()
root = target.CreateValueFromAddress('root', lldb.SBAddress(0x100004058, target), pointer)
然后我运行
root.GetValue()
我得到类似 0x0000000100004041 的信息
我在这里使用 SBAddress 的构造函数有什么问题吗?
你必须注意什么指向什么才能正确。 0x100004058 是您要从中创建类型的指针的值,还是该指针的位置?我怀疑是前者...
作为指针值的地址处的内存保存着一个“node_t”类型的对象。所以当你想从那个内存中创建一个 SBValue 时,你想要的类型是“node_t”而不是“node_t *”。
但是,如果 0x100004058 是指针的位置,那么在该地址处将值作为指向 node_t 的指针是正确的。
所以,例如,停在这里:
* thread #1: tid = 0x4ae2e3, function: take_void , stop reason = breakpoint 1.1
frame #0: 0x0000000100000f33 pointers`take_void at pointers.c:12
9 void
10 take_void(void *input)
11 {
-> 12 printf("Got pointer: %p.\n", input);
13 }
14
15 int
呼叫方:
15 int
16 main()
17 {
18 struct Foo my_foo = {111, 222};
19 take_void (&my_foo);
20 return 0;
21 }
然后:
(lldb) fr v -L
0x00007fff5fbff658: (void *) input = 0x00007fff5fbff670
首地址为输入位置,所以:
(lldb) script
>>> ptr_type = lldb.target.FindFirstType('Foo').GetPointerType()
>>> root = lldb.target.CreateValueFromAddress("root", lldb.SBAddress(0x00007fff5fbff658, lldb.target), ptr_type)
>>> root.GetValue()
'0x00007fff5fbff670'
这是您所期望的。并且:
>>> root = lldb.target.CreateValueFromAddress("root", lldb.SBAddress(0x00007fff5fbff670, lldb.target), type)
>>> root.GetValue()
没错,因为结构没有值。并且:
>>> root.GetChildAtIndex(0).GetValue()
'111'
>>> root.GetChildAtIndex(1).GetValue()
'222'
这些是我在字段中输入的值,所以这是正确的。并且:
>>> root = lldb.target.CreateValueFromAddress("root", lldb.SBAddress(0x00007fff5fbff670, lldb.target), ptr_type)
>>> root.GetValue()
'0x000000de0000006f'
(这可能是你犯的错误)也有道理,因为 0xde 是 222 而 0x6f 是 111 而且我在小端系统上......
我正在使用 SBValue
自己的 CreateValueFromAddress
方法。它没有很好地记录,但我已经弄清楚了参数并且它们比目标的更简单。像这样使用它(不需要特殊的地址函数,只需简单的 + 运算符):
offset_in_bytes = base_address + some_offset
some_other_sbvalue.CreateValueFromAddress("name-of-new-value", offset_in_bytes, value_type)