変数のアドレスを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を使用しています)
はい、-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"