调试 C 程序时如何将 gdb 值转换为 python 数字对象

How to convert a gdb Value to a python numeral object while debugging C program

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

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

从我的搜索中返回的每个 link 点 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?

您可以使用 intfloat 直接从 Value 转换它:

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

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

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

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

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