LLDB Python API SBAddress构造函数错误

时间:2016-07-07 17:40:24

标签: lldb

我正在尝试从我拥有的地址值创建一个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的构造函数做错了吗?

2 个答案:

答案 0 :(得分:1)

你必须要小心什么才能指明这一点。 0x100004058是您想要输入类型的指针的值,还是该指针的LOCATION?我怀疑是前者......

作为指针值的地址处的存储器保存类型为" 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

第一个地址是输入的位置,所以:

>>> 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而我是小端系统......

答案 1 :(得分:0)

我正在使用 SBValue 自己的 CreateValueFromAddress 方法。它没有被很好地记录下来,但是我已经弄清楚了参数,它们比目标的参数更简单。像这样使用它(不需要特殊的地址函数,只需简单的 + 运算符):

offset_in_bytes = base_address + some_offset
some_other_sbvalue.CreateValueFromAddress("name-of-new-value", offset_in_bytes, value_type)