web-dev-qa-db-ja.com

lldb:変数のアドレスを出力します

変数のアドレスをlldbで出力しようとしています。ただし、print &(myVar)を呼び出すと、アドレスではなく変数の内容が出力されます。

_(lldb) print &(myVar)
(const string *) $18 = "hello"
_

expression &(myVar)についても同じです。

_(lldb) expression &(myVar)
(const string *) $19 = "hello"
_

expressionの_-L_オプションも試しました:

_(lldb) expression -L -- &(myVar)
0x00000000021aea80: (const string *) $20 = "hello"

(lldb) expression -L -- myVar
0x0000000002a15430: (std::string) $23 = "hello"
_

ただし、出力されるアドレスは、_expression -L_を呼び出すたびに変わります。したがって、メモリ内の変数のアドレスに対応していないと想定しています。

メモリ内の変数のアドレスを取得するにはどうすればよいですか?

(私はlldb 3.4を使用しています)

13
Gael Lorieul

はい、-Lの場所は、lldbが式の結果を表すために作成する変数について示しているため、これは必要なことではありません。共通のコマンドエイリアスprintは、このコマンドが値を出力するだけのように見えますが、それ以上のことを行います。実行中のプログラムで新しいエンティティを作成します。したがって、式の結果の場所は、評価した式と簡単に関連しているわけではありません。

とにかく、これを達成するための2つの簡単な方法があります。 1つ目は、文字列の要約をオフにして、アドレスを出力した実際の結果を確認できるようにすることです。

(lldb) expr --raw -- &my_string
(string *) $14 = 0x00007fff5fbff618

同じデータを取得する別の方法は、「フレーム変数」コマンドを使用することです。このコマンドを使用すると、完全な式パーサーのオーバーヘッドなしで、ローカル変数にアクセスできます。 frame variableは、デバッグ情報によって報告されたとおりに変数を直接出力します。その場合、-Lオプションは正確に変数の場所です。

(lldb) frame var -L my_string
0x00007fff5fbff618: (std::__1::string) my_string = "Some string here"
16
Jim Ingham