2
我需要在Linux上64位机检索调用栈的指令指针(RIP )一些帮助。我可以使用ptrace遍历堆栈并检索所有帧/基址指针(RBP)值。但是因为我需要IP值,所以RIP和RBP之间的算术和概念关系是什么。 我假设RIP值存储在(RBP + 8)位置,并且可以使用ptrace PEEKDATA来读取它。我的假设是否正确?关联程序/指令指针(RIP)和基地/帧指针(RBP)之间的Linux
我需要在Linux上64位机检索调用栈的指令指针(RIP )一些帮助。我可以使用ptrace遍历堆栈并检索所有帧/基址指针(RBP)值。但是因为我需要IP值,所以RIP和RBP之间的算术和概念关系是什么。 我假设RIP值存储在(RBP + 8)位置,并且可以使用ptrace PEEKDATA来读取它。我的假设是否正确?关联程序/指令指针(RIP)和基地/帧指针(RBP)之间的Linux
在当前正在执行的函数返回后,任何返回地址都会在%rip
之后开始,而不是当前正在执行的函数的%rip
。你应该能够让你的手对当前%rip
以同样的方式做GDB:
PTRACE_GETREGS
或PTRACE_GETREGSET
说法。您的联机帮助页和头文件应该能让您从这里开始。PTRACE_PEEKUSER
参数从用户区域获取寄存器。您可以查看GDB源代码树中gdb/amd64-linux-nat.c
的gorey细节。
调用堆栈的布局取决于调用约定和处理器体系结构。请参阅http://en.wikipedia.org/wiki/Call_stack和http://en.wikipedia.org/wiki/Calling_convention。也许ptrace把这个抽象掉了,但我实际上并不知道。 – 2010-07-07 12:11:59