在
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
的名字吗?
正如其中一条评论中提到的,您可以使用 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脚本中,例如:
可能还有更多事情可以做,但希望您可以根据需要进行扩展。
C类可以通过abi::__cxa_demangle获得,但是我不知道如何获得A类