2010-07-07 121 views
2

我需要在Linux上64位机检索调用栈的指令指针(RIP )一些帮助。我可以使用ptrace遍历堆栈并检索所有帧/基址指针(RBP)值。但是因为我需要IP值,所以RIP和RBP之间的算术和概念关系是什么。 我假设RIP值存储在(RBP + 8)位置,并且可以使用ptrace PEEKDATA来读取它。我的假设是否正确?关联程序/指令指针(RIP)和基地/帧指针(RBP)之间的Linux

+0

调用堆栈的布局取决于调用约定和处理器体系结构。请参阅http://en.wikipedia.org/wiki/Call_stack和http://en.wikipedia.org/wiki/Calling_convention。也许ptrace把这个抽象掉了,但我实际上并不知道。 – 2010-07-07 12:11:59

回答

2

在当前正在执行的函数返回后,任何返回地址都会在%rip之后开始,而不是当前正在执行的函数的%rip。你应该能够让你的手对当前%rip以同样的方式做GDB:

  • 理想情况下,你的平台支持PTRACE_GETREGSPTRACE_GETREGSET说法。您的联机帮助页和头文件应该能让您从这里开始。
  • 如果失败,您应该能够使用具有适当偏移量的PTRACE_PEEKUSER参数从用户区域获取寄存器。

您可以查看GDB源代码树中gdb/amd64-linux-nat.c的gorey细节。