2012-10-31 26 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。