如何在GDB中打印包含类型信息的结构体变量值
GDB打印带类型信息的结构体变量
在调试C语言程序时,默认的print(简写p)命令打印结构体变量只能显示字段值,无法同时展示变量及各字段的类型。以下是具体场景和解决方案:
示例代码
typedef struct inner { int aOut; int bOut; } Inner; typedef struct inner2 { int aOut; Inner bOut; } Inner2; typedef struct outer { Inner2 thStruct; int var; } Outer; Outer global = { { 1, { 2, 3 } }, 4 }; int main(int argc, char *argv[]) { Outer local = { { 666, { 2, 3 } }, 4 }; return 0; }
默认输出 vs 期望输出
- 执行
p local的默认输出(仅含值):$1 = {thStruct = {aOut = 666, bOut = {aOut = 2, bOut = 3}}, var = 4} - 期望的输出(同时包含类型与值):
$1: Outer = {thStruct: Inner2 = {aOut: int = 666, bOut: Inner = {aOut: int = 2, bOut: int = 3}}, var: int = 4}
explore local命令虽能查看类型,但需手动展开非标量类型,操作不够高效。
解决方案
1. 自定义GDB命令(Python脚本)
利用GDB的Python扩展能力,编写一个自定义命令实现自动遍历类型与值的格式化输出。
将以下代码保存为print_with_type.py,或直接在GDB中执行:
import gdb class PrintWithType(gdb.Command): def __init__(self): super().__init__('pwt', gdb.COMMAND_DATA, gdb.COMPLETE_EXPRESSION) def invoke(self, arg, from_tty): try: val = gdb.parse_and_eval(arg) typename = str(val.type) result = self.format_val(val) print(f"${gdb.get_next_serial_number()}: {typename} = {result}") except Exception as e: print(f"Error: {e}") def format_val(self, val): val_type = val.type if val_type.code in (gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION): fields = [] for field in val_type.fields(): field_val = val[field.name] field_typename = str(field.type) fields.append(f"{field.name}: {field_typename} = {self.format_val(field_val)}") return "{" + ", ".join(fields) + "}" elif val_type.code == gdb.TYPE_CODE_ARRAY: elements = [self.format_val(val[i]) for i in range(val_type.sizeof // val_type.target().sizeof)] return "[" + ", ".join(elements) + "]" else: return str(val) PrintWithType()
加载脚本后,使用pwt local命令即可得到符合期望的输出:
$1: Outer = {thStruct: Inner2 = {aOut: int = 666, bOut: Inner = {aOut: int = 2, bOut: int = 3}}, var: int = 4}
2. 快速临时方案(无需脚本)
如果不想编写脚本,可同时执行两个命令分别查看类型与值:
ptype local:输出变量的完整类型结构type = struct outer { struct inner2 thStruct; int var; }p local:输出变量的字段值
两者配合可满足类型查看需求,但无法合并为单一格式输出。
内容的提问来源于stack exchange,提问作者gozag
相关产品推荐
相关产品推荐

