我正在尝试使用 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 并等待几秒钟后得到它。
有什么专家可以帮助我解决这个问题吗?我知道我需要例程中的上下文才能获取寄存器,但我找不到任何将上下文作为对象返回的函数...
最佳答案
在您的 RTN_InsertCall 中,您添加了线程 ID,但在您的 SETRTN_CONTEXT 函数声明中您没有收到线程 ID...可能需要解决这个问题。
此外,在您的分析例程 SETRTN_CONTEXT 中,您实际上并未在应用程序外部保存任何内容。如果 m_ctxt 是您在其他地方操作的全局变量,我可能是错的,除非您在每次分析例程运行时都以线程安全的方式执行此操作,否则这怎么可能是合理的?
显然,您想将信息写入某个文件或输出。我建议使用某种 xml 工具;这使得解析变得容易,如果你聪明地编写你的 pintools,你可以通过遵守一些接口(interface)契约来交换输出的格式。
同时为了澄清您的困惑,您尝试插入分析例程以在特定图像中的每个函数之前运行;每次在该图像中调用该函数时,您的 SETRTN_CONTEXT 都会运行。
关于c++ - 尝试使用引脚工具从堆栈中打印寄存器的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13150869/