获取gdb中具有属性的类名

问题描述 投票:0回答:2

gdb
中是否可以知道具有特定属性的类的名称?

这是一个例子:

class A
{
    public:
    int my_val;
};

class B: public A
{
    public:
    int my_other_val;
};

class C: public B
{
    public:
    int my_other_other_val;
};


int main(int argc, char* argv[])
{

    C obj1;
    obj1.my_val = 10;
}

obj1
我可以知道具有
class
属性的
my_val
的名字吗?

c++ gdb
2个回答
0
投票

正如其中一条评论中提到的,您可以使用 GDB 的 Python API 添加满足您需求的命令。详细信息可以在这里找到。

为了帮助您开始,这里有一个粗略的初剪。将以下内容放入名为

find-attr.py
的文件中:

import shlex

class FindAttrCommand(gdb.Command):
    """find-attr VALUE NAME

    Search through all the fields in VALUE, and any base classes of
    VALUE, looking for a field NAME.  Print out some information for
    any matching fields found.
    """
    def __init__(self):
        gdb.Command.__init__(self, "find-attr", gdb.COMMAND_DATA)

    def check(self, path, type, name):
        if path == "":
            path = type.name
        else:
            path = path + "::" + type.name
        for field in type.fields():
            if field.name == name:
                print(f"Found {path}::{name}")
            if field.is_base_class and field.type is not None:
                self.check(path, field.type, name)

    def invoke(self, arg_str, from_tty):
        args = shlex.split(arg_str)
        value = gdb.parse_and_eval(args[0])
        type = value.type
        self.check("", type, args[1])

FindAttrCommand ()

然后在 GDB 会话中:

$ gdb -q ./findit
Reading symbols from ./findit...
(gdb) source find-attr.py
(gdb) start
Temporary breakpoint 1 at 0x401111: file findit.cc, line 24.
Starting program: /tmp/findit 

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffaea8) at findit.cc:24
24      obj1.my_val = 10;
(gdb) n
25      return 0;
(gdb) find-attr obj1 my_val
Found C::B::A::my_val
(gdb) q

还有很多东西可以添加到Python脚本中,例如:

  • 它根本没有错误处理,
  • 您可能想要添加一个允许字段名称进行正则表达式匹配的选项,
  • 您可以添加命令完成。

可能还有更多事情可以做,但希望您可以根据需要进行扩展。


-3
投票

C类可以通过abi::__cxa_demangle获得,但是我不知道如何获得A类

© www.soinside.com 2019 - 2024. All rights reserved.