2016-07-07 2 views
0

私は持っているアドレス値からSB Valueを作成しようとしていますが、SBAddressコンストラクターに関する問題が発生しています。私はこれを行うとき:LLDB Python API SBAddressコンストラクターエラー

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

をそして私は何かが私がSBAddressのコンストラクタで、ここでやっていることを間違ってあり、私は0x0000000100004041

ような何かを得る

root.GetValue() 

を実行しますか?

答えて

1

この権利を得るために何を指しているのか注意する必要があります。 0x100004058は、タイプを作成するポインタのVALUEか、そのポインタの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であると私はリトルエンディアンシステム上でだから、あまりにも理にかなって...

+0

のは、私が言ってみましょうroot = lldb.target.FindFirstGlobalVariable( 'root')を実行して取得できるグローバル変数 'root'を持っていて、root.GetValue()を実行して値0x100004058を与え、root.GetType()は私に'node_t *'。今度は、lldb.target.CreateValueFromAddress()を使用して同じ正確な変数を作成し、root.GetType()と同じ結果を得たいとします。これが私が問題に取り組んでいるところです。 – Jatinshravan

+0

ポインタの値は、ポインタが指すメモリです。そのメモリに存在するオブジェクトはそのポインターのpointee型である。だからあなたの場合、 "ルート"オブジェクトのGetValueから取得したアドレスから値を作成する場合、使用するタイプは "node_t *"ではなく "node_t"です。 –

+0

右。私はこれと感謝を得る。 1つの質問をしたかっただけです。上記の例では、構造体に 'value'がないため、root.GetValue()はNoneを返します。しかし、実際には正当な価値を持つ2人の子供がいます。迷惑メールがある無効なアドレスを渡したとしましょう.GetValue()はまだNoneを返しますが、root.GetNumChildren()関数を持つ子が2つあるとします。もちろん、GetValue()が呼び出されると、2人の子はNoneを返します。ルート変数に実際に迷惑メールが含まれているかどうかを調べる簡単な方法はありますか? – Jatinshravan