GDB Python API调用older()帧读取结构体成员失败问题咨询
问题
尝试打印调用者函数中实例化的结构体成员变量的值时,使用gdb.newest_frame().older().read_var读取结构体变量本身正常,但无法识别其成员。这是预期行为还是bug?
代码示例
typedef struct { int a; int b; } ex_struct; void first_level_func(ex_struct *ex_s) { ex_s->a++; } int main(void) { ex_struct e_s = {4,5}; first_level_func(&e_s); }
GDB操作及报错
Breakpoint 2, first_level_func (ex_s=0x7fffffffbff8) at test.c:23 23 ex_s->a++; (gdb) python print(gdb.newest_frame().older().read_var("e_s")) {a = 4, b = 5} (gdb) python print(gdb.newest_frame().older().read_var("e_s.a")) Traceback (most recent call last): File "<string>", line 1, in <module> ValueError: Variable 'e_s.a' not found. Error while executing Python code.
预期输出值4,但实际报错:ValueError: Variable 'e_s.a' not found。
解答
这是预期行为,不是bug。
原因在于read_var方法的设计:它只能接受单个变量名作为参数,无法直接解析带成员访问符的表达式(比如e_s.a)。当你传入e_s时,GDB能正确定位到这个结构体变量;但传入e_s.a时,GDB会把它当作一个完整的变量名去查找,自然找不到对应的变量。
要获取结构体成员的值,有两种可行的方法:
- 方法一:先读取结构体变量,再通过属性访问成员
frame = gdb.newest_frame().older() e_s_var = frame.read_var("e_s") print(e_s_var['a']) - 方法二:使用
frame.evaluate()方法直接解析表达式print(gdb.newest_frame().older().evaluate("e_s.a"))
这两种方法都能正确输出预期的成员值4。
内容的提问来源于stack exchange,提问作者Mashy
相关产品推荐
相关产品推荐

