使用“$\”和“$\_”变量
优质
小牛编辑
130浏览
2023-12-01
#include <stdio.h>
int main(void)
{
int i = 0;
char a[100];
for (i = 0; i < sizeof(a); i++)
{
a[i] = i;
}
return 0;
}
技巧
"x
"命令会把最后检查的内存地址值存在“$_
”这个“convenience variable”中,并且会把这个地址中的内容放在“$__
”这个“convenience variable”,以上面程序为例:
(gdb) b a.c:13
Breakpoint 1 at 0x4004a0: file a.c, line 13.
(gdb) r
Starting program: /data2/home/nanxiao/a
Breakpoint 1, main () at a.c:13
13 return 0;
(gdb) x/16xb a
0x7fffffffe4a0: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
0x7fffffffe4a8: 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
(gdb) p $_
$1 = (int8_t *) 0x7fffffffe4af
(gdb) p $__
$2 = 15
可以看到“$_
”值为0x7fffffffe4af
,正好是"x
"命令检查的最后的内存地址。而“$__
”值为15
。
另外要注意有些命令(像“info line
”和“info breakpoint
”)会提供一个默认的地址给"x
"命令检查,而这些命令也会把“$_
”的值变为那个默认地址值:
(gdb) p $_
$5 = (int8_t *) 0x7fffffffe4af
(gdb) info breakpoint
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004004a0 in main at a.c:13
breakpoint already hit 1 time
(gdb) p $_
$6 = (void *) 0x4004a0 <main+44>
可以看到使用“info breakpoint
”命令后,“$_
”值变为0x4004a0
。
参见 gdb手册.