GDB调试变量、内存与寄存器查看与修改 _

发布时间:2026/6/29 4:09:50
GDB调试变量、内存与寄存器查看与修改 _ 变量查看与修改在使用 GDB 调试程序时除了控制程序的运行流程以外最常见的操作就是查看变量的值、查看参数的值以及在调试过程中临时修改某些变量的值。通过这些命令可以观察程序运行时的数据变化从而判断程序逻辑是否符合预期。1.1 查看函数参数使用info args(i args)命令可以查看当前函数传入参数的值包括main函数的argv与argc参数。i args例如当前程序停在某个函数内部void test(int a, int b) { int sum a b; }在断点处执行i args就可以看见传入的a和b变量的值除了使用i args也可以直接使用print(p)命令打印某个参数的值p a p b1.2 查看变量1、查看普通变量在 GDB 中可以使用print命令查看变量的值print可以简写为p。p [变量名]例如p num p ch默认情况下p命令会按照变量本身的类型打印结果。如果想按照不同格式查看变量可以在p后面加格式控制。常见格式如下命令含义p/d var按十进制打印p/x var按十六进制打印p/t var按二进制打印p/o var按八进制打印p/c var按字符打印p/s var按字符串打印例如p/d num p/x num p/t num p/c ch如果有如下代码int num 65; char ch A;执行p/d num p/x num p/c num可能得到$1 65 $2 0x41 $3 65 A这样可以方便地从不同角度查看变量的值。2、查看变量类型如果想查看变量的类型可以使用如下命令ptype [变量名]ptype显示的信息详细适合查看结构体、指针、数组等复杂类型。例如有如下结构体定义struct Student { char name[32]; int age; }; struct Student stu {Tom, 18}; struct Student *pstu stu;在 GDB 中可以执行ptype stu可能得到type struct Student { char name[32]; int age; }这说明变量stu的类型是struct Student并且 GDB 会把结构体中的成员也显示出来。如果查看结构体指针变量ptype pstu可能得到type struct Student *这说明pstu是一个指向struct Student类型的指针。如果想查看指针指向的对象类型也可以对指针解引用后再查看ptype *pstu可能得到type struct Student { char name[32]; int age; }在调试结构体、链表、树、数组指针等复杂数据结构时ptype非常有用可以帮助我们快速确认变量的数据类型以及内部成员组成。whatis命令可以用来查看结构体类派生类普通函数以及类成员函数ptype命令可以更加详细的查看这些内容如果显示一个类ptype会把类的成员变量和成员函数都显示出来i variables命令用来查看全局变量或者静态变量比如我们看见一个变量使用但是不知道该变量是在哪定义的就可以使用这个命令ptype /m //只显示成员变量不显示成员函数 ptype /t //不现实typedef的内容 ptype /o //显示结构体或者类的内存构造以及大小例如如果我们对结构体占用内存大小进行优化可以使用ptype命令对结构体进行查看查看他对内存空间的利用率(gdb) ptype /o node /* offset | size */ type struct NODE { /* 0 | 4 */ int ID; /* 4 | 4 */ int age; /* 8 | 1 */ char gender; /* XXX 7-byte hole */ /* 16 | 8 */ NODE *next; /* 24 | 4 */ int test; /* 28 | 1 */ char c; /* XXX 3-byte padding */ /* total size (bytes): 32 */ }可以看见对于上面的结构体所有成员直接加起来才22个字节但是使用不合理的排布之后会用32个字节才能存下调整结构体之后可以优化内存布局到24个字节(gdb) ptype /o node2 /* offset | size */ type struct NODE2 { /* 0 | 4 */ int ID; /* 4 | 4 */ int age; /* 8 | 8 */ NODE *next; /* 16 | 4 */ int test; /* 20 | 1 */ char gender; /* 21 | 1 */ char c; /* XXX 2-byte padding */ /* total size (bytes): 24 */ }