【ARM Linux 系统稳定性分析入门及渐进11 -- GDB( print 和 p 的使用| @ 和 ::的使用|ptype|{<type>} <addr> )】


请阅读嵌入式及芯片开发学必备专栏

上篇文章:ARM Linux 系统稳定性分析入门及渐进10 – GDB 初始化脚本介绍及使用

gdb print 和 p的使用


语法格式

print <expr>
print /<f> <expr>

print 和许多 GDB 的命令一样,可以接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,既然是表达式,那么就可以是当前程序运行中的const常量、变量、函数等内容。

GDB不能使用程序中所定义的宏。

例如,假设你有一个变量i,你可以使用print命令来打印它的值:

(gdb) print i 
$1 = 42

在这个例子中,print命令打印了变量i的值,它是42

注意,GDB为每个打印的值都分配了一个编号(在这个例子中,编号是$1),你可以在后续的命令中引用这个编号。

你也可以使用print命令来打印函数的返回值,例如:

(gdb) print strlen("hello") 
$2 = 5

在这个例子中,print命令打印了strlen("hello")的返回值,它是5

此外,print命令还可以用来修改变量的值。例如,你可以这样修改变量i的值:

(gdb) print i=100 
$3 = 100

在这个例子中,print命令将i的值修改为100,并打印了新的值。

gdb 操作符"::“和”@"的使用

在GDB中,@::运算符主要用于处理数组和类。

@运算符可以用于在调试时查看数组的内容。例如,如果你有一个包含5个元素的数组arr,你可以用如下的方式查看数组的所有元素:

(gdb) p *arr@5 
$1 = {0, 1, 2, 3, 4}

在这个例子中,*arr@5表示从数组arr的开始位置起的5个元素。

::运算符用于访问C++类的静态成员。例如,如果你有一个名为MyClass的类,它有一个名为myVar的静态成员,你可以用如下的方式访问这个成员:

(gdb) p MyClass::myVar 
$2 = 42

在这个例子中,MyClass::myVar表示类MyClass的静态成员myVar

ptype 的使用

在GDB中,ptype命令用于打印变量或类型的定义。这对于查看数据类型的具体结构非常有用,特别是对于复杂的数据类型如结构体、联合体或类。

例如,假设你有一个名为MyStruct的结构:

struct MyStruct 
{ 
	int a; 
	double b; 
};

你可以使用ptype命令来打印结构的定义:

(gdb) ptype MyStruct /* 0x40063c <_ZTS8MyStruct>: "MyStruct" */ 
type = struct MyStruct { int a; double b; };

在这个例子中,ptype命令打印了MyStruct的定义,包括它的所有成员及其类型。

你也可以使用ptype命令来打印变量的类型。例如,假设你有一个MyStruct类型的变量myVar,你可以使用ptype命令来打印它的类型:

(gdb) ptype myVar 
type = MyStruct

在这个例子中,ptype命令打印了变量myVar的类型,它是MyStruct

{<type>} <addr> 介绍

在GDB中,你可以使用{<type>} <addr>的形式来将一个地址转换为特定的类型。这在处理低级别的内存操作时非常有用。

例如,假设你有一个指向整数的指针,但你知道这个地址实际上包含了一个浮点数,你可以使用这种形式来将地址转换为浮点数:

(gdb) p *{float*}0x40063c $1 = 3.14159

在这个例子中,{float*}0x40063c表示将地址0x40063c转换为float*类型的指针,然后*运算符获取这个指针指向的值。结果是,这个地址上存储的浮点数3.14159被正确地读取出来。

注意,这种形式对于处理复杂的数据类型也非常有用,例如结构体或类。你可以使用这种形式来获取存储在特定地址的数据的成员。例如:

(gdb) p {MyStruct*}0x40063c->a 
$2 = 42

在这个例子中,地址0x40063c被转换为MyStruct*类型的指针,然后使用->运算符来获取a成员的值。

上篇文章:ARM Linux 系统稳定性分析入门及渐进10 – GDB 初始化脚本介绍及使用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公讲 ARM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值