在我的代码,我有如何设置一个变量写入观察点堆栈
mov x21, 0
str x21, [x29, 16]
代码
再后来,
ldr x22, [x29, 16]
存储0到X22。 然后,即使在后面的代码,我有
ldr x23, [x29, 16]
其结束存储214748364800到X23,即使在这两个ldr
命令之间没有str
命令。
我的问题是我如何设置[x29, 16]
位置的观察点在堆栈上,以便我可以看到它的写入时间?
我正在使用gdb进行调试。
编辑: 这是当我在gdb的输出上设置监视在X29 + 16位置
Breakpoint 2, 0x0000000000400668 in inittest()
1: x/i $pc
=> 0x400668 <inittest+8>: mov x21, #0x0 // #0
(gdb) ni
0x000000000040066c in inittest()
1: x/i $pc
=> 0x40066c <inittest+12>: str x21, [x29,#16]
(gdb) p/x $x29+16
$1 = 0x3fffffff340
(gdb) x/x $x29+16
0x3fffffff340: 0xb8002d40
(gdb) watch *(int*)0x3fffffff340
Hardware watchpoint 5: *(int*)0x3fffffff340
(gdb) c
Continuing.
Hardware watchpoint 5: *(int*)0x3fffffff340
Old value = -1207947968
New value = 0
0x0000000000400670 in inittest()
1: x/i $pc
=> 0x400670 <inittest+16>: b 0x4006d8 <testOut>
以后gdb的输出的一部分:
(gdb) p $x24
$4 = 103
(gdb) x/x $x29+24
0x3fffffff348: 0x00000000
(gdb) ni
0x00000000004006b4 in testIn()
1: x/i $pc
=> 0x4006b4 <testIn+16>: ldr x24, [x29,#16]
(gdb) x/x $x29+16
0x3fffffff340: 0x00000000
(gdb) ni
如果我是在这里键入p$x24
,它显示214748364800
,即使它从[x29,#16]
加载0
0x00000000004006b8 in testIn()
1: x/i $pc
=> 0x4006b8 <testIn+20>: ldr w23, [x19,x21,lsl #2]
(gdb) ni
0x00000000004006bc in testIn()
1: x/i $pc
=> 0x4006bc <testIn+24>: str w23, [x29,#28]
(gdb)
0x00000000004006c0 in testIn()
1: x/i $pc
=> 0x4006c0 <testIn+28>: ldr w23, [x19,x24,lsl #2]
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x00000000004006c0 in testIn()
1: x/i $pc
=> 0x4006c0 <testIn+28>: ldr w23, [x19,x24,lsl #2]
错误的产生是因为x24
只能是大约54
最大,由于内存分配
在'str'上放置一个断点,然后在断点被击中时'x29 + 16'的任何值添加手表。注意你也需要确保'x29'没有改变。 – Jester
如果你用'(int *)'类型的'watch',你可以试试dbg:'(gdb)print sizeof(int)'吗?如果它是4,并且你正在使用little-endian模式,那么你只能看第4个字节(保持为零),0x32发生在第5个字节。 – Ped7g
我输入'print sizeof(int)'并且它说4.另外,在调用'ldr'时它加载0x3200000000而不是0,之后我输入'x/4x $ x29 + 16'来查看全部4个字节,第二个字节,而不是“0x00000000”,实际上是0x00000032。我猜这就是改变的地方。我如何在第二个字节上专门设置手表?它只是简单地设置显示我输入'p/x $ x29 + 17'的十六进制代码吗? (16是第一个字节,17是第二个等等?) –