4、gdb学习之主要变量操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_29983883/article/details/102646543

在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 查看所有寄存器的情况。(包括浮点寄存器)
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_29983883/article/details/102646543