You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:05:37