2014-03-31 49 views
2

在Python中,我有一個類型爲gdb.Value的變量「var」,它對應於一個C++結構體。該結構有一個方法「void foo()」。 我可以評估這個表達式「var ['foo']」。但「var ['foo']()」會抱怨說RuntimeError:值不可調用(不是TYPE_CODE_FUNC)。我相信值類型將是gdb.TYPE_CODE_METHOD(不確定,但var ['foo']。type.code返回16)在我的情況。所以我想問題是python API支持對類方法的調用,如果沒有,是否有解決方法?謝謝!gdb python api:是否可以調用類/結構體方法

回答

2

好的,我想我能夠使用湯姆的建議和另一種解決方法來做我想做的事。我需要一個額外的解決方法的問題是(正如我在上面的評論中提到的),我沒有變量名稱來組成一個形式的字符串:「myval.method()」傳遞給gdb.parse_and_eval。因此,解決方法是獲取變量的地址,然後將其轉換爲該類型,然後向該字符串添加方法調用。 gdb.Value的python api中都有類型和地址。所以解決方案如下所示:

eval_string = "(*("+str(self.val.type)+"*)("+str(self.val.address)+")).method()" 
    return gdb.parse_and_eval(eval_string); 
1

這只是一個沒有人實現的缺失功能。您可能會看到它是否在bugzilla中,如果沒有,請提交bug。

一個典型的解決方法是將「this」參數的值替換爲字符串,並通過gdb.parse_and_eval進行調用。這通常有效,但當然明顯是次佳。

+0

Tom,謝謝你的迴應。我想嘗試你建議的解決方法,但這是我的問題。我使用python api進行漂亮的打印。在我註冊漂亮打印的類中,我只會得到ctor中變量的值,而我沒有變量名,除非gdb.Value具有它,否則我不認爲。在下面的std :: string示例中,「val」是gdb.Value,而不是可用的變量名稱,對嗎? 類StdStringPrinter(對象): 「打印的std :: string」 DEF __init __(個體,VAL): self.val = VAL DEF to_string(個體): 返回self.val [ '_ M_dataplus'] [」 _M_p'] – aayupov

+0

這是一個非常類似的bugzilla請求供我們參考:[link](https://sourceware.org/bugzilla/show_bug.cgi?id=13326) – aayupov

相關問題