2017-01-17 1 views
1

私は、GDBで次のコマンドを入力する:gdbは64ビットアドレスを出力できますか?

(gdb) p PyObject_GetAttrString($2, "_other_obj_m") 

を、変数のアドレスタイプ(PyObject *)である必要があり、次の出力を得ました。

$4 = -246881136 

は、その後、私は進形式に変換するためにprintf関数を使用して間違ったアドレス「0xf148e490」を得た、実アドレスは「0x4f78f148e490」です。 誰でもこの問題を解決する方法を知っていますか?

答えて

1

ターゲットプログラムに関数のデバッグ情報がない場合、gdbは関数の戻り型がintであるとみなします。 x86_64 Linuxでは、4バイトになる可能性があります。

$ gdb -q python2.7 
(gdb) ptype PyObject_GetAttrString 
type = int() 
(gdb) p sizeof(int) 
$1 = 4 

ターゲットにデバッグ情報がある場合は、正しい結果が得られます。

$ gdb -q python2.7-dbg 
Reading symbols from python2.7-dbg...done. 
(gdb) ptype PyObject_GetAttrString 
type = struct _object { 
    struct _object *_ob_next; 
    struct _object *_ob_prev; 
    Py_ssize_t ob_refcnt; 
    struct _typeobject *ob_type; 
} *(PyObject *, const char *) 

あなたが任意のデバッグ情報を持っていない場合は、正しい型シグネチャに、またはそのようなvoid *を返す機能するためにポインタとして、十分に近いだものに関数シンボルをキャストすることができます。試してみてください:

(gdb) p ((void * (*)(void *, char *))PyObject_GetAttrString)($2, "_other_obj_m") 
+0

ありがとうございます@MarkP。 PyObject_GetAttrString)($ 2、 "_other_obj_m") '正しい答えを得てください。 –

+0

私はコマンド 'p((PyObject *(PyObject *、char *)(PyObject *、char *))(PyObject_GetAttrString)($ 4、" _other_obj_m ")'によって正しい答えを得ることができますが、時には次の出力のような ' : –

関連する問題