目录
当前位置: 首页 > 文档资料 > 100个 gdb 小技巧 >

使用“$\”和“$\_”变量

优质
小牛编辑
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手册.