2016-09-21 24 views
1

便宜上、GDBに補助マルコスを定義したいのですが、そのうちの1つはoffsetof()マクロです。 1. tpyeなどstruct nodeとしてはStructnode、そう$arg0 = Struct$arg1 = nodeに分割されます: GDBでoffsetof()マクロを定義する方法

は、私はそれが動作しない

define offsetof 
    if $argc == 2 
     (int)(&((($arg0 *)0)->$arg1)) 
    end 
end 

を試してみました。 2. gdbのコマンドが値を返すことができるかどうかわかりません。

誰も私に手を差し伸べることはできますか?

答えて

5

offsetofをコマンドとして定義するのではなく、関数として定義する方が良いと思います。あなたは式でそれを使うことができます。オフセットを表示したい場合は、常にprintを使用してください。

offsetofを関数として定義するには2通りの方法があります。

あなたがCまたはC++をデバッグする場合は、単にマクロとして定義することができます

(gdb) macro define offsetof(t, f) &((t *) 0)->f) 

だから、与えられた:私のマシン上で

struct x { 
    int a; 
    long b; 
}; 

私が手:

(gdb) p offsetof(struct x, a) 
$1 = (int *) 0x0 
(gdb) p offsetof(struct x, b) 
$2 = (long *) 0x8 

上記の "CまたはC++"の制限の理由は、他の言語がgdbの組み込みプリプロセッサを介して式を実行しないためです。

他の言語でも動作させたい場合、答えはPythonで新しい便利関数を書くことです。これはもう少し複雑ですが、gdb.Functionのgdbドキュメントを参照してください。

0

あなたが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以外の属性が記載されています。これは、構造体レイアウトに関するその他の詳細を報告する場合にも重要です。

関連する問題