info r显示的第二列和第三列表示什么,,不v知道怎么什么意思
其实通过上面过程我们了解到函数调用就是通过这种压栈和出栈调用的,其实还是蛮简单的。
对于我们调试来说,如果因为程序的错误破坏了栈,但是有个地方数据不会破坏那就是寄存器的值,所以我们可以通过 打印rbp和rsp的值得到了最后调用栈的栈底和栈顶,但是这个这两个地址间的数据可能被破坏了,怎么办那,那就是以此地址为基准,继续对上找,就会找到其他函数的栈信息。
使用到的命令如下:
(gdb) p $rbp
$40 = (void *) 0x7fffffffdff0
(gdb) p $rsp
$41 = (void *) 0x7fffffffdfe0
(gdb) x /8ag $rbp
0x7fffffffdff0: 0x7fffffffe010 0x400673 <b(int, char**)+46>
0x7fffffffe000: 0x7fffffffe118 0x100000000
0x7fffffffe010: 0x7fffffffe030 0x400695 <main(int, char**)+32>
0x7fffffffe020: 0x7fffffffe118 0x100000000
(gdb)
这样我们知道了,前面的调用栈原来是通过main
函数调用到b
函数,接着再调用到我们core的函数,从而定位core的大概位置。
每个寄存器的值,第二列是16进制格式,第三列是10进制格式。