2010-12-03 95 views
1

我想知道除了使用「GetThreadContext」之外,是否還有一種方法可以獲得不同進程(Windows上的C++)中線程的EBP。我懷疑這種方法花費了太多時間(我使用了很多),如果我能夠得到EBP而不是所有CONTEXT的值,它會更快。
我正在考慮使用「ReadProcessMemory」,然後將EBP與其餘的調用堆棧進行比較,但是我不知道堆棧應該在哪裏以及從哪裏得到它。
如果有人知道更好的方法,我很樂意聽到它。
謝謝:)在另一個進程中獲取線程的EBP

+1

你在寫什麼,一個分析器?也許如果你解釋你的問題,有人可以給你一個更快的方式。 – 2010-12-04 23:55:50

+0

是的,一個分析器:) – Idov 2010-12-05 06:53:00

回答

3

如果線程正在運行,另一個線程的EBP的運行值當然是在EBP寄存器中。如果它沒有運行,它會被內核中的調度程序保存。 GetThreadContext正在檢索內核中的內容;沒有別的會更快。

表現情況比我在寫這篇文章時所理解的要糟糕。如果線程正在運行,內核將使用APC機制爲您獲取最新的值。這不是很快,但沒有其他替代API。

1

GetThreadContext將是唯一的方法,因爲EBP是一個寄存器;處理器在執行上下文切換時將其保存起來。讀取線程寄存器的唯一方法是使用GetThreadContext。

當然,不能保證EBP具有您想要的值...使用幀指針省略編譯的函數不會可靠地將EBP設置爲當前調用幀的幀指針。

如果您只是在尋找堆棧跟蹤(最常見的原因希望EBP開始),我可能會建議StackWalk64

相關問題