在对程序gdb调试时,如果需要深入到某个函数的栈帧进行调试时,一般需要显示rbp/ebp、rsp/esp、pc等寄存器的值,或者显示以rsp/esp为参照地址计算出来的其他变量的值。
如下所示:
(gdb)p *(int*)(&rsp + 0x4)
(gdb)p *(long*)(&rsp + 0x4)
(gdb)p *(short*)(&rsp + 0x4)
(gdb)p *(char*)(&rsp + 0x4)
(gdb)p *(long long*)(&rsp + 0x4)
(gdb)p *(float*)(&rsp + 0x4)
(gdb)p *(double*)(&rsp + 0x4)
(gdb)printf "%.2e\n", *(float*)($rsp +0x4)
(gdb)printf "%.3e\n", *(double)($rsp +0x4)
(gdb)p/x *(int*)($rsp + 0x4)
对于以上*(int*)($rsp = 0x4)形式不是很理解的,如果对下面的大小端判断程序理解的话,道理都是一样的。
bool isLittleEndian()
{
int a = 0x41424344;
return ((char*)&a)[0] == 0x44;
}
bool isBiggerEndian()
{
int a = 0x41424344;
return ((char*)&a)[0] == 0x41;
}
(完)