在Python中,我有一个类型为var
的变量gdb.Value
,它对应于C ++结构。
struct有一个方法void foo()
。
我可以评估此表达式var['foo']
。但var['foo']\()
会抱怨说
RuntimeError: Value is not callable (not TYPE_CODE_FUNC)
我认为值类型为gdb.TYPE_CODE_METHOD
(不确定,但var['foo'].type.code
会返回16
)。
所以我猜问题是:
python API是否支持对类方法的调用,如果没有,是否有解决方法?
谢谢!
答案 0 :(得分:6)
好吧,我想我能够根据汤姆的建议和其他解决方法做我想做的事。
我需要一个额外的解决方法的问题是(正如我在上面的评论中所提到的)我没有变量名来组成一个表单字符串:myval.method()
以传递给{{1} }。
因此,该方法的解决方法是获取变量的地址,然后将其转换为类型,然后向字符串添加方法调用。
gdb.Value的python api中存在类型和地址。所以解决方案如下所示:
gdb.parse_and_eval
答案 1 :(得分:2)
它只是一个缺少任何人尚未实现的功能。您可能会看到它是否在bugzilla中,如果没有,则提交错误。
一个典型的解决方法是替换"这个"将参数值转换为字符串并通过gdb.parse_and_eval进行调用。这通常有效,但当然是次佳的。
答案 2 :(得分:1)
GDB 不(还?)支持方法调用。 https://gdb.sourceware.narkive.com/KVTUIAvl/c-method-call-for-a-gdb-value-object-from-within-python
但是支持函数调用。如果您有机会制作一个函数包装器来调用您的方法:
void func(mystruct& arg) { arg.method(); }
然后你可以通过全局gdb搜索找到这个func,并调用:
sym = gdb.lookup_global_symbol('namespace::func(mystruct&)')
result = sym.value()(this.val)
此方法不需要获取变量的地址,由于编译器优化,该方法有 50% 的时间会失败。