gdb python api:是否可以调用类/ struct方法

时间:2014-03-31 23:23:21

标签: python gdb pretty-print

在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是否支持对类方法的调用,如果没有,是否有解决方法?

谢谢!

3 个答案:

答案 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% 的时间会失败。