我正在尝试使用 pin 工具在不同的例程中打印出堆栈。我能够获得所有的例程,但我对如何获取存储在该例程堆栈中的寄存器中的地址有点困惑。
我所拥有的是:
VOID SETRTN_CONTEXT(CONTEXT * ctxt)
{
ADDRINT reg_address;
PIN_SaveContext(ctxt, &m_ctxt);
reg_address = PIN_GetContextReg(&m_ctxt, REG_STACK_PTR);
}
在另一个函数中,我有这段代码调用该函数:
for(rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn) )
{
RTN_Open(rtn);
RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)SETRTN_CONTEXT,
IARG_CONST_CONTEXT, IARG_THREAD_ID, IARG_END);
RTN_Close(rtn);
}
当例程调用该函数时,我有点困惑,因为我只得到一个结果,并且在附加 Pin 并等待几秒钟后得到它。
有什么针头可以帮助我解决这个问题吗?我知道我需要例程中的上下文才能获取寄存器,但我找不到任何将上下文作为对象返回的函数......