上篇文章: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 初始化脚本介绍及使用