2012-10-31 23 views
1

我试图使用引脚工具在不同例程中打印出堆栈。我能够获得所有的例程,但是我对如何获取存储在该例程堆栈中的寄存器中的地址有些困惑。尝试使用引脚工具从堆栈中打印寄存器的值

什么我已经是这样的:

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附加并等待几秒钟后得到它。

任何可能帮助我在这一个pinheads?我明白,我需要从常规情况下,为了得到寄存器,但我无法找到返回上下文对象的函数...

+0

这似乎特定于您正在使用的针工具。你有没有试过查看它的文档?我相信[this](http://www.cs.virginia.edu/kim/publicity/pin/docs/39599/Pin/html/index.html)就是这样。 –

+0

为什么不使用用户模式调试器? –

+0

是的,我完成了他们的文档,找不到任何有用的东西。这不是太具体 - 在这段代码中使用的所有函数都来自Pin API,我只是没有得到任何结果。@ slavik262 – attis

回答

0

在你RTN_InsertCall,添加线程ID,并在SETRTN_CONTEXT函数声明你没有收到线程ID ...可能想解决这个问题。

此外,在您的分析例程SETRTN_CONTEXT中,实际上并未保存应用程序外部的任何内容。如果m_ctxt是您在其他地方操作的全局变量,那么我可能会错误,除非您每次运行分析例程并以线程安全的方式执行此操作,否则这听起来可能会有声音?

显然,您想要将信息写入某个文件或输出。我建议使用某种xml工具;这使得它很容易解析,如果你巧妙地编写你的pintools,你可以通过服从一些接口契约来交换输出的格式。此外,为了澄清您的疑惑,您尝试插入分析例程以在特定图像中的每个函数之前运行;每次在该图像中调用该函数时,都会运行SETRTN_CONTEXT。