gdb没有CodeWarrior强大,但是也提供了查看寄存器的命令:
(gdb) info register r1
r1 0xbffffb40 3221224256
(gdb) info registers
r0 0x1000052c 268436780
r1 0xbffffb40 3221224256
r2 0x48026ea0 1208118944
r3 0x14 20
r4 0xfef2d90 267333008
r5 0x0 0
r6 0x1 1
r7 0xff4f67c 267712124
r8 0x202d000 33738752
r9 0x1 1
r10 0x0 0
r11 0xbffffa70 3221224048
r12 0x20000082 536871042
r13 0x100189d0 268536272
r14 0x0 0
r15 0x0 0
r16 0x0 0
r17 0x0 0
r18 0x0 0
r19 0x0 0
r20 0x0 0
r21 0x0 0
r22 0x0 0
---Type to continue, or q to quit---
r23 0x0 0
r24 0x0 0
r25 0x0 0
r26 0x0 0
r27 0x4802f52c 1208153388
r28 0x48030018 1208156184
r29 0x0 0
r30 0xffebff4 268353524
r31 0xbffffb40 3221224256
pc 0x1000052c 0x1000052c
msr 0x2d900 186624
cr 0x2a000022 704643106
lr 0x1000052c 0x1000052c
ctr 0xc027c8fc 3223832828
xer 0x0 0
acc 0x0 0
spefscr 0x3c 60
orig_r3 0x1 1
trap 0x700 1792
你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
输出格式
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量 的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
原文件:
+108>+108>
double z = 39.2315;
float x = 39.2315;
调试过程:
+108>+108>
Breakpoint 1, main () at testall.c:15
15 //double a = 2.0 * z;
(gdb) info addr x
Symbol "x" is static storage at address 0x100109d8.
(gdb) info addr z
Symbol "z" is static storage at address 0x100109d0.
(gdb) x /1fw 0x100109d8
0x100109d8 : 39.2314987
(gdb) p x
$1 = 39.2314987
(gdb) p z
$2 = 39.231499999999997
(gdb) x /1fg 0x100109d0
0x100109d0 : 39.231499999999997
(gdb)
由此可见float的精度差很多。+108>+108>