2

Python 統合を使用して gdb のコマンドを作成し、変数のアドレスを取得しようとしています。私はすでに使用している値を持っています:

v = gdb.parse_and_eval("var_name")

ただしv、タイプに応じて、さまざまな方法でシリアル化できます。たとえば、 の場合、次のchar*ように表示されます。

>>> print v
0x7f06a2cfd320 "x"
>>> print v.address
None

わかりました、これは期待どおりに機能しません。最初に逆参照してからアドレスを取得しようとしましたが、元の値が返されます。

>>> print v.dereference().address
0x7f06a2cfd320 "x"

住所部分だけを取得するにはどうすればよいですか? これまでに見つけた唯一の方法は、少し長く見えます。

>>> vptr = gdb.lookup_type("void").pointer()
>>> print v.cast(vptr)
0x7f06a2cfd320

もっと直接的な方法はありますか?

4

1 に答える 1

2

あなたが何を求めているのか、私には完全には明らかではありません。

最初の部分では、変数「var_name」のアドレスが必要なようです。この場合、あなたが書いたように「.address」が必要です。ただし、すべての変数にアドレスがあるわけではないことに注意してください。たとえば、コンパイラによって変数をレジスタに入れることができます。この属性の値が None であることを考えると、これが起こったことだと思います。(他の gdb コマンドを使用して確認できます...)

ただし、2 番目の部分では、ポインターの値が必要なように思えます。値を直接使用することもできます (+ のようなものは Value で正常に機能します)。または、Python の「long」に直接キャストして、値を単純な古いスカラーとして取得することもできます。

number = long(v)
于 2013-10-02T01:45:02.117 に答える