在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
A
回答
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進行調用。這通常有效,但當然明顯是次佳。
相關問題
- 1. 是否可以在結構體上調用put_in調用?
- 2. 是否可以在回調方法中使用reset()API方法?
- 3. 是否可以從Application類的Activity類中調用方法?
- 4. 是否可以通過make()來調用結構構造函數?
- 5. 是否可以從C程序中調用python方法?
- 6. 是否可以從抽象類中調用方法?
- 7. 是否可以通過異步管道調用類方法
- 8. 檢查,看是否可以調用來自API的方法調用前
- 9. SystemVerilog結構的個體變量是否可以用++遞增?
- 10. 是否可以在ASP.NET MVC中使用n層體系結構?
- 11. 是否可以使用gdb庫?
- 12. 是否可以從Java調用COM API?
- 13. 是否可以攔截Documentum API調用?
- 14. 是否可以從Open Tools API調用重構?
- 15. 是否可以在非異步方法中調用awaitable方法?
- 16. 是否可以從已有主方法的類調用main方法?
- 17. 調用沒有結構的python類方法
- 18. 是否可以確定實例方法是否在原型方法中調用?
- 19. 是否可以使用GDB對Python進行反向調試?怎麼樣?
- 20. Python:是否可以向Tuple類添加新方法
- 21. 是否有Delphi 6的實用程序可以分析類層次結構並可以查詢方法祖先?
- 22. 是否可以使用gdb通過ssh遠程調試?
- 23. 是類還是結構體
- 24. 我如何可以調用變量方法在結構
- 25. 第三方API調用的Web應用程序體系結構
- 26. 在onDestroy之後是否可以調用回調方法?
- 27. PHP類的結構,是否使用靜態方法?
- 28. 是否可以設置混合體繫結構羣集?
- 29. 是否可以禁用隱式構造函數方法/調用的注入?
- 30. 是否可以確定pthread_t結構是否未使用?
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
這是一個非常類似的bugzilla請求供我們參考:[link](https://sourceware.org/bugzilla/show_bug.cgi?id=13326) – aayupov