10

在 Python 中,我有一个对应于 C++ 结构var的类型变量。gdb.Value

该结构有一个方法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 是否支持对类方法的调用,如果不支持,是否有解决方法?

谢谢!

4

3 回答 3

9

好的,我想我能够使用汤姆的建议和另一种解决方法来做我想做的事。

我需要一个额外的解决方法的问题是(正如我在上面的评论中提到的)我没有变量名来组成一个表单字符串: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);
于 2014-04-01T22:21:01.950 回答
3

这只是一个尚未实现的缺失功能。您可能会查看它是否在 bugzilla 中,如果没有,请提交错误。

一个典型的解决方法是将“this”参数的值替换为字符串并通过 gdb.parse_and_eval 进行调用。这通常有效,但当然是第二好的。

于 2014-04-01T01:44:15.487 回答
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 搜索找到这个函数,然后调用:

sym = gdb.lookup_global_symbol('namespace::func(mystruct&)')
result = sym.value()(this.val)

此方法不需要获取变量的地址,由于编译器优化,该方法有 50% 的时间失败。

于 2021-05-11T07:08:10.637 回答