2013-06-05 43 views
0

主要結構是(gdb)p/x在gdb python腳本中相當於什麼?

struct my_struct 
{ 
    int x; 
    void* md_template; 
    void* md_capture_buff; 
    .... 
}; 

當我在做

(gdb) p ((struct my_struct *)dev_base->next->priv)

輸出是這樣

$1 = { 
x= 15 '\017' 
md_template = , 
md_capture_buff = 
} 

,當我有p/X做:

(gdb) p/x ((struct my_struct *)dev_base->next->priv)

輸出是這樣

$1 = { 
x= 0xf; 
md_template =0x410027001a50 , 
md_capture_buff = 0x41002c0c5490 
} 

在GDB-蟒:

python val = gdb.parse_and_eval('((struct my_struct *)dev_base->next->priv)')

python print val

的輸出是:

$1 = { 
x= 15 '\017' 
md_template = , 
md_capture_buff = 
} 

那麼如何在gdb-python中編寫等同於p/x的代碼呢?或者如何在Python腳本中獲取'md_capture_buff'的地址,因爲python val = gdb.parse_and_eval('((struct my_struct *)dev_base->next->priv)').address不會保留地址?

回答

0

您可能已關閉「設置打印地址」。我不會這樣做。這可能是str運算符尊重這個設置的一個錯誤。

除了直接調用「p/x」以外,沒有一種好的方法來重現「p/x」。請參閱gdb.execute。

您可以使用[]獲取任何字段的值。像

val = something['fieldname'] 

IMO通常使用API​​而不是parse_and_eval。也就是說,你可以直接從Python中投射,查看字段等。

+0

@tromey,謝謝。但是,如果一個數組作爲成員出現時遍歷一個結構,那麼如何以十六進制打印整個數組的值(更具可讀性)。只有'p/x'纔有可能。但是我們不能在遍歷中使用'gdb.execute'('p/x ')'。我想在這個腳本中實現這個http://stackoverflow.com/questions/16787289/gdb-python-parsing-structures-each-field-and-print-them-with-proper-value-if。請讓我知道是否有辦法做到這一點。我們可以控制打印數組,因爲指針是在這個腳本中完成的嗎? –

+0

沒有一個簡單的方法。 –

+0

我試圖避免parse_and_eval(),但我不知道如何直接讀取結構指針沒有它。假設OP的問題,我可以使用什麼API來避免使用parse_and_eval()? –