你必須小心指出什麼是正確的。 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,我就是一個小端系統上...
比方說,我有一個全局變量'root',我可以運行root = lldb.target.FindFirstGlobalVariable('root'),然後運行root.GetValue(),它給了我一個值0x100004058和root.GetType()給我'node_t *'。現在我想通過使用lldb.target.CreateValueFromAddress()來創建相同的確切變量,其結果與root.GetType()相同。這是我遇到問題的地方。 – Jatinshravan
指針的值是指針指向的內存。駐留在該內存中的對象是該指針的指針類型。因此,就你的情況而言,當你從你的「根」對象的GetValue地址創建一個值時,你想使用的類型是「node_t」而不是「node_t *」。 –
對。我明白了,謝謝。 只想問一個問題。在上面給出的例子中,root.GetValue()返回None,因爲結構沒有'value'。但實際上它包含兩個有合法價值的孩子。假設我傳入了一個無效的地址,那裏有垃圾,root.GetValue()仍然返回None,它仍然說有兩個孩子使用root.GetNumChildren()函數。但是,當調用GetValue()時,兩個孩子當然會返回None。有沒有更簡單的方法來查找根變量是否實際上包含垃圾? – Jatinshravan