如何在gdb中获取拥有指定成员属性的类的名称?
在GDB中查找拥有指定成员属性的类名称
可以通过GDB的内置命令或自定义Python脚本实现这个需求,以下针对你的示例代码给出具体方法:
手动查询(适合简单继承结构)
假设你已在GDB中启动调试,断点停在obj1.my_val = 10;这一行:
查看对象的完整类型
执行命令:ptype obj1输出会显示
obj1的类型为class C : public B,同时列出完整的继承层次。逐层检查基类成员
先检查C类的成员:info members C会发现
C未定义my_val,接着检查基类B:info members BB也没有my_val,最后检查B的基类A:info members A此时会看到
int my_val;,说明my_val是在类A中定义的。
脚本自动查询(适合复杂继承场景)
如果继承层次复杂,手动查询效率低,可以用GDB的Python API写脚本自动遍历继承链:
创建脚本文件
find_member_owner.py,内容如下:import gdb def find_member_owner(obj_name, member_name): try: obj_val = gdb.parse_and_eval(obj_name) obj_type = obj_val.type.unqualified() current_type = obj_type while current_type: # 检查当前类是否包含目标成员 for field in current_type.fields(): if field.name == member_name: print(f"成员 '{member_name}' 定义在类 '{current_type.name}' 中") return # 切换到下一层基类(单继承场景,多继承可扩展逻辑) if current_type.base_classes: current_type = current_type.base_classes[0].type.unqualified() else: break print(f"在继承链中未找到成员 '{member_name}'") except Exception as e: print(f"查询出错: {str(e)}") # 注册为GDB命令 class FindMemberOwner(gdb.Command): def __init__(self): super(FindMemberOwner, self).__init__("find-member-owner", gdb.COMMAND_DATA) def invoke(self, args, from_tty): args = args.split() if len(args) != 2: print("用法: find-member-owner <对象名> <成员名>") return find_member_owner(args[0], args[1]) FindMemberOwner()在GDB中加载脚本:
source find_member_owner.py直接调用命令查询:
find-member-owner obj1 my_val会直接输出结果:
成员 'my_val' 定义在类 'A' 中
内容的提问来源于stack exchange,提问作者Trl
相关产品推荐
相关产品推荐

