我正在向我的调试器添加一个功能(我正在使用 Ptrace 来操纵跟踪的进程以及 libbfd/libopcodes)来展开堆栈并确定每个 CALL 分配的堆栈空间和静态派生的局部变量大小之间是否存在差异,沿途打印每个帧的地址和本地堆栈大小。
我的一般方法是获取基指针(EBP
/ RBP
)中的地址,将指针递增到应该包含存储的帧指针,取消引用该地址,检查它PTRACE_PEEKDATA
并重复,直到我取消引用占用堆栈外区域的地址。
我知道如何检查代码/数据段寄存器,但理想情况下,我想要一种方法来检查我是否仍在调用堆栈内,即使分段已被 W^X 内存页或其他不可执行的堆栈更改。
简而言之,当我移出堆栈而不触发一般保护故障时,如何检查(在一般情况下)?
(顺便说一句,我意识到我正在假设检查地址的页段是这里的理想方法——也许存在另一种更简单的方法来确定地址是否在当前进程的堆栈空间内)