2014-03-31 40 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

相关问题