3

我在调试 C 程序时使用 python2.6 的 gdb 模块,并希望根据实例的“.Type”将 gdb.Value 实例转换为 python 数字对象(变量)。

例如,通过 将我的 C 程序SomeStruct->some_float_val = 1./6;转换为 Python gdb.Value sfv=gdb.parse_and_eval('SomeStruct->some_double_val'),但然后将其转换为双精度浮点 Python 变量——知道str(sfv.type.strip_typedefs())=='double'它的大小为 8B——而不只是使用字符串转换,dbl=float(str(sfv))而是Value.string()像解包字节struct用于获取正确的双精度值。

从我的搜索点返回的每个链接https://sourceware.org/gdb/onlinedocs/gdb/Values-From-Inferior.html#Values-From-Inferior,但我看不到如何将 Value 实例转换为 python变量干净,说 Value 甚至不在 C 内存中,而是表示 gdb.Value.address (所以不能使用Inferior.read_memory()),如何在不转换字符串值的情况下将其转换为 Python int ?

4

2 回答 2

5

您可以直接从Valueusingint或转换它float

(gdb) python print int(gdb.Value(0))
0
(gdb) python print float(gdb.Value(0.0))
0.0

但是,系统中似乎至少存在一个故障,因为float(gdb.Value(0))它不起作用。

于 2015-04-29T02:56:40.757 回答
0

我在试图弄清楚如何对指针进行按位运算时偶然发现了这一点。在我的特定用例中,我需要计算页面对齐偏移量。Python 不想将指针 Value 转换为 int,但是,以下方法有效:

int(ptr.cast(gdb.lookup_type("unsigned long long")))

我们首先让 gdb 将指针转换为 unsigned long long,然后生成的 gdb.Value 可以转换为 Python int。

于 2022-02-07T17:43:12.107 回答