使用gdb Python API获取C++函数参数名时始终得到None
问题:GDB Python API提取C++函数参数名时返回None
需求背景
需要区分函数中的命名参数与匿名参数,同时保留参数传入顺序,因此info args或遍历gdb.Block这类方法不适用——它们无法包含匿名参数。
测试代码
将以下代码编译为调试版本测试:
// library.h auto named(int a, int b) -> int; // library.cpp auto named(int a, int b) -> int { return 0; }
GDB操作及结果
在GDB中设置断点后执行以下Python命令,发现参数的name属性始终返回None:
(gdb) python named = gdb.parse_and_eval("named") (gdb) python print(named.type) int (int, int) (gdb) python print(named.type.fields()) [<gdb.Field object at 0x7f79663f29d0>, <gdb.Field object at 0x7f79663f2a10>] (gdb) python print(named.type.fields()[0].name) None (gdb) python print(named.type.fields()[1].name) None
官方文档说明
根据GDB官方文档:
函数:Type.fields ()
...
- 函数和方法类型的每个参数对应一个字段。C++类的基类型也会表示为字段。
...
每个字段都是一个gdb.Field对象,包含预定义属性:
...
name
字段的名称,匿名字段则为None。
原本期望输出参数名'a'和'b',因为在声明和定义中都显式指定了参数名,并非仅存在于原型中。
疑问
是否对gdb.Field.name存在误解?该属性是不是仅对表示C++类/结构体的gdb.Type有意义?
测试环境
使用的GDB版本:
- 12.1(apt发布版)
- 13.0.90.20230102(每周快照版)
内容的提问来源于stack exchange,提问作者dROOOze
相关产品推荐
相关产品推荐

