あなたがoffsetof
を定義するためのpythonを使用している場合、あなたはこのような何かを始めるかもしれません:あなたは、ファイルにあることを保存し、あなたはそれを保存するディレクトリは、あなたができる、sys.path
であることを保証した場合
import gdb
class offsetof(gdb.Command):
def invoke(self, args, from_tty):
value, name = args.split()
struct = gdb.parse_and_eval(value)
fields = { field.name: field for field in struct.type.fields() }
gdb.write("{} offset: {} bits\n".format(name, fields[name].bitpos))
offsetof("offsetof", gdb.COMMAND_USER)
それをインポートします。あなたのGDBは、あなたが>>>
プロンプト、次の各コマンドにpython
を付加することができます何pi
コマンドを持っていない場合は
(gdb) pi
>>> import os
>>> sys.path.insert(0, os.getenv('HOME'))
>>> import offsetof
>>>
(gdb)
:あなたはあなたのホームディレクトリに保存している場合たとえば、あなたはこれらの線に沿って何かをするかもしれません。
gdbがoffsetof
をインポートしても問題がなければ、offsetof
をgdbコマンドとして呼び出すことができます。書かれているように、2つの引数(スペースで区切られた)、値、および名前が必要です。値が与えられた名前を持つフィールドを持つ構造体である場合、基本的なPythonコードがビットフィールドを扱うことができるため、オフセットはバイト単位で報告されます(バイトではありません)。
ここのコードを改善することができます。それはそれが呼び出すコードから継承したものを超えて実際のエラー処理を持ちませんし、書かれているようにポインタを処理しません。
This pageは、その例で使用される基になるコードの一部を記述しています。それが指し示すメソッドは、ポインタの処理の始めを提供するかもしれません(または、渡す値のポインタを間接参照することができます。つまり、最初のパラメータとしてthis
ではなく*this
を指定することができます)。 Type.fields()
のセクションには、bitpos
以外の属性が記載されています。これは、構造体レイアウトに関するその他の詳細を報告する場合にも重要です。