gdb...

《用gdb查看内存/打印变量》
格式: x /nfu

参数说明:

x 是 examine 的缩写 
n表示要显示的内存单元的个数 
f表示显示方式, 可取如下值 
x 按十六进制格式显示变量。 
d 按十进制格式显示变量。 
u 按十进制格式显示无符号整型。 
o 按八进制格式显示变量。 
t 按二进制格式显示变量。 
a 按十六进制格式显示变量。 
i 指令地址格式 
c 按字符格式显示变量。 
f 按浮点数格式显示变量。 
u表示一个地址单元的长度 
b表示单字节, 
h表示双字节, 
w表示四字节, 
g表示八字节

Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal), 
t(binary), f(float), a(address), i(instruction), c(char) and s(string). 
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes) 
举例 
x/3uh buf  
表示从内存地址buf读取内容, 
h表示以双字节为一个单位, 
3表示三个单位, 
u表示按十六进制显示 
例子: 
n是个局部变量 
Breakpoint 1, main (argc=1, argv=0xbffff3a4) at calc.c:7 
7 int n = atoi(argv[1]); 
(gdb) print &n 
1=(int∗)0xbffff2ec(gdb)x0xbffff2ec0xbffff2ec:0x00282ff4(gdb)print∗(int∗)0xbffff2ec2 = 2633716 
(gdb) x /4xw 0xbffff2ec 
0xbffff2ec: 0x00282ff4 0x080484e0 0x00000000 0xbffff378 
(gdb) x /4dw 0xbffff2ec 
0xbffff2ec: 2633716 134513888 0 -1073745032 

# 显示0x7fffffffd708(这是个地址)处1个(n=1)单字节(u=b)的内容,以十六进制(f=x)表示;
(gdb)x/1xb  0x7fffffffd708
0x7fffffffd708: 0x26

也可以省略n f u参数:

(gdb) x/ 0x402470
0x402470:       0x00400f7c



作者:dounine
链接:https://www.jianshu.com/p/e51fc3608623
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

《print》

  • print <expr>,打印指定表达式的值(表达式可以是变量,也可以是地址)
  • 可以根据全局变量和static变量名访问相应的内存,或是crash时的相关地址
  • print /<f> <expr>,将指定表达式的值以f格式输出

f的格式包括:

  • x 按十六进制格式显示变量。
  • d 按十进制格式显示变量。
  • u 按十六进制格式显示无符号整型。
  • o 按八进制格式显示变量。
  • t 按二进制格式显示变量。
  • a 按十六进制格式显示变量。
  • c 按字符格式显示变量。
  • f 按浮点数格式显示变量。

示例:

(gdb) print &i
$1 = (int *) 0xbffff46c
(gdb) print i
$2 = 2
(gdb) print i+=1
$3 = 3
(gdb) print i
$4 = 3

(gdb) start
Temporary breakpoint 1 at 0x5ac: file hello2.c, line 5.
Starting program: /home/dounine/gdb/hello2

Temporary breakpoint 1, main () at hello2.c:5
5               char *c = "hello world";
(gdb) p c
$1 = 0x400601 <__libc_csu_init+33> "\215\203\354\376\377\377)\306\301\376\002\205\366t%1\377\215\266"
(gdb) p /s c
$2 = 0x400601 <__libc_csu_init+33> "\215\203\354\376\377\377)\306\301\376\002\205\366t%1\377\215\266"
(gdb) p (char*)c
$3 = 0x400601 <__libc_csu_init+33> "\215\203\354\376\377\377)\306\301\376\002\205\366t%1\377\215\266"
(gdb) p *((char*)c)='H'
$4 = 72 'H'
(gdb) p c
$5 = 0x400601 <__libc_csu_init+33> "H\203\354\376\377\377)\306\301\376\002\205\366t%1\377\215\266"

(gdb) p *(type*)A.B.C

$2 = {

  le = {

    next = 0x0,

    prev = 0x0

  },

上面的$2表示这个结构体的地址,后面可以直接用这个来表示地址访问,这个是递增的,在这一次gdb过程中有效。

(gdb) p *(type*)$2->XX           //按照访问结构体变量的逻辑打印变量的内容

注意:可以在print <expr>的时候,通过表达式设定某个变量的值

BT:

打印当前crash的backtrace,我们可以根据前面number切换栈帧,frame 6等,切换到某个函数位置,然后info locals打印当前栈帧的局部变量的值,查看当前局部的变量的内存状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值