2016-07-07 132 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