调试 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?
您可以使用 int
或 float
直接从 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.
我在调试 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?
您可以使用 int
或 float
直接从 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.