2011-11-26 53 views
2

有沒有辦法通過分析API讀取託管線程的System.Thread.ThreadState屬性ICofProfilerInfo或IMetadataImport接口或從非託管代碼的任何其他方式?如何通過分析API(ICofProfilerInfo或任何IMetadataImport或任何其他方式)讀取System.Threading.Thread.ThreadState

例如是這樣的:

ICorProfilerInfo3 pProfilerInfo = ...; 
ThreadID threadId; 
pProfilerInfo->GetCurrentThreadID(&threadId); 
ThreadState threadState; 
pSomethingWhatINeed->GetManagedTheadState(threadId, &threadState); 
if(threadState == THREADSTATE_WAIT_JOIN_SLEEP){ 
    //do something 
} 

回答

3

您可以使用ICorDebug.GetProcess獲得ICorDebugProcess,從中你可以通過調用GetThread得到ICorDebugThread。然後致電GetUserState以獲得CorDebugUserState。但是要小心,當使用ICorDebug調試器時,惡意程序必須是不同的過程。

+0

這是個好主意和有用的提示,但是我需要在使用大量ICorProfiler的過程中獲取此信息。 – Honzajscz

+1

我想我的原始答案還不夠清楚 - 我編輯過它。從另一個進程的一個進程同時使用ICorDebug和ICorProfiler是完全正確的。我的觀點是,進程不能使用ICorDebug來調試自己(不像ICorProfiler--哪個進程可以是自己的分析器)。 – MagnatLU

相關問題