2016-07-07 39 views
0

我试图从地址值创建一个SB值,我遇到了SBAddress构造函数的问题。当我这样做:LLDB Python API SBAddress构造函数错误

target = lldb.debugger.GetSelectedTarget() 
pointer = target.FindFirstType('node_t').GetPointerType() 
root = target.CreateValueFromAddress('root', lldb.SBAddress(0x100004058, target), pointer) 

然后我跑

root.GetValue() 

我得到类似0x0000000100004041

有什么问题,我在这里做与SBAddress的构造?

回答

1

你必须小心指出什么是正确的。 0x100004058 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 

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

>>> 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,我就是一个小端系统上...

+0

比方说,我有一个全局变量'root',我可以运行root = lldb.target.FindFirstGlobalVariable('root'),然后运行root.GetValue(),它给了我一个值0x100004058和root.GetType()给我'node_t *'。现在我想通过使用lldb.target.CreateValueFromAddress()来创建相同的确切变量,其结果与root.GetType()相同。这是我遇到问题的地方。 – Jatinshravan

+0

指针的值是指针指向的内存。驻留在该内存中的对象是该指针的指针类型。因此,就你的情况而言,当你从你的“根”对象的GetValue地址创建一个值时,你想使用的类型是“node_t”而不是“node_t *”。 –

+0

对。我明白了,谢谢。 只想问一个问题。在上面给出的例子中,root.GetValue()返回None,因为结构没有'value'。但实际上它包含两个有合法价值的孩子。假设我传入了一个无效的地址,那里有垃圾,root.GetValue()仍然返回None,它仍然说有两个孩子使用root.GetNumChildren()函数。但是,当调用GetValue()时,两个孩子当然会返回None。有没有更简单的方法来查找根变量是否实际上包含垃圾? – Jatinshravan