在gdb中,查看变量的值主要使用print整个命令,print格式是
print xxx
p xxx
下面使用的code
//test.cpp
#include <iostream>
using namespace std;
int* t;
int main(){
int i = 1;
int b[] = {1,2,3,4,5};
t = new int(10);
for(int j = 0;j < 10;j++)
*(t+j) = j*10;
return 0;
}
查看普通变量
直接使用print 变量名
,但是需要注意的是如果局部变量和全局变量的变量名相同时,这时候需要加域,例如print filename:varname
或者print function:varname
;
查看数组
1)查看静态数组
如果查看静态数组情况,就可以之间使用print + 变量名
2)查看动态数组
当查看动态数组的时候如果直接使用print + 变量名就会出现意向不到的情况,这是需要使用print+*变量名@大小
程序中,变量t是通过动态分配内存的,当我们直接使用p t
可以发现打印的是变量所存储的地址而不是数组,
当然我们也可以通过强制转换来获取内容,
输出格式
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量
查看内存
使用examine(简写x)来查看内存地址中的值。语法:
x/nfu
n、f、u是可选的参数。
(1)n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
(2)f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
(3)u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
我们知道上面的动态数组的地址是0x602010,所以我们也可以通过查看内存的方法进行查看数组,第一个是通过十进制显示第一个数,2是十六进制显示第二个数,3是十六进制显示显示10个数,由于我们的地址是从0x602014开始,即从第二个数开始的,所以最后一个是0,这是因为越界没有初始化,4是从0x602010开始十进制显示10个数
查看寄存器
(1)要查看寄存器的值,很简单,可以使用如下命令:
- info registers 查看寄存器的情况。(除了浮点寄存器)
- info all-registers 查看所有寄存器的情况。(包括浮点寄存器)