我需要一些帮助来检索Linux 64位机器上的调用堆栈的指令指针( RIP )。我可以使用ptrace遍历堆栈并检索所有帧/基指针( RBP )值。但是,由于我想要IP值,RIP和RBP之间的算术和概念关系是什么。 我假设RIP值存储在(RBP + 8)位置,并且可以使用ptrace PEEKDATA 读取它。我的假设是正确的吗?
答案 0 :(得分:2)
在堆栈上推送的任何返回地址只会在当前运行的函数返回后启动%rip
,而不是当前正在执行的函数的%rip
。您应该能够以与GDB相同的方式获取当前%rip
:
PTRACE_GETREGS
或PTRACE_GETREGSET
参数。您的联机帮助页和头文件应该可以让您完成剩下的工作。PTRACE_PEEKUSER
参数从用户区域中获取寄存器。您可以在GDB源代码树中查看gdb/amd64-linux-nat.c
中的gorey详细信息。