共用方式為


同處理序並存程式碼剖析

從 .NET Framework 4 開始,多個 .NET Framework 版本可以在同一個處理序中並存執行。 程式碼剖析工具必須能夠感知並存,才能在這種環境中執行。如果正在進行程式碼剖析的處理序沒有裝載多個 .NET Framework 版本,設計成使用 .NET Framework 2.0 版、.NET Framework 2.0 SP1、.NET Framework 3.0、.NET Framework 3.5 或 .NET Framework 3.5 SP1 的程式碼剖析工具就可以用於 .NET Framework 4 版中。 如需如何使用同處理序並存程式碼剖析的詳細資訊,請參閱程式碼剖析工具相容性設定

並存感知

如果某個程式碼剖析工具可確定載入多個執行階段的應用程式不會導致程式碼剖析工具遇到非預期的中斷,例如存取違規,就表示此程式碼剖析工具能夠感知並存。 並存感知包括下列支援層級:

  • 程式碼剖析第一個: 載入處理序中的第一個 Common Language Runtime (CLR) 版本會進行程式碼剖析,但是後續的 CLR 版本則不會。 雖然您必須針對要在其 COM Class Factory 物件上進行的多個 CreateInstance 呼叫備妥程式碼剖析工具,不過它不需要支援在其 COM 物件的多個執行個體上同時使用回呼。 此程式碼剖析工具只會接受第一個 Class Factory CreateInstance 呼叫和 Initialize 回呼呼叫,而讓其餘呼叫失敗。

  • 程式碼剖析一個: 與程式碼剖析第一個很相似,而不同之處在於程式碼剖析工具會讓使用者選擇即將進行程式碼剖析的 CLR 版本,而且只針對所載入的第一個 CLR 版本進行程式碼剖析。

  • 程式碼剖析許多個: 使用者會選擇一個或多個 (可能所有) 要進行程式碼剖析的 CLR 版本。 程式碼剖析工具會從這些 CLR 版本中取用回呼並重新呼叫 Info 函式進入適當的版本。 這會要求程式碼剖析工具追蹤哪個執行階段項目 (函式、應用程式定義域、類別、物件等等) 屬於哪個 CLR。

注意事項注意事項

針對 .NET Framework 4 所設計的程式碼剖析工具必須能夠感知並存。也就是說,如果某個程式碼剖析工具會實作 ICorProfilerCallback3 介面,它就必須實作其中一個配置 (程式碼剖析第一個、程式碼剖析一個或程式碼剖析許多個),以便確定多個執行階段不會導致程式碼剖析工具遇到非預期的中斷。

程式碼剖析許多個支援的需求

若要支援程式碼剖析許多個選項,程式碼剖析工具必須能夠進行下列作業:

  • 讓全域函式的呼叫與正確的執行階段產生關聯。

  • 讓各種 ID (例如 ObjectID、FunctionID、ClassID、ModuleID、AssemblyID、AppDomainID 等等) 與正確的執行階段產生關聯,並且確定來自某個執行階段的 ID 絕對不會傳遞至另一個執行階段的 ICorProfilerCallback(2,3) 介面。 不過,將任何執行階段或機器碼中的任何指令指標傳入任何執行階段的 ICorProfilerInfo::GetFunctionFromIP 方法實作是可接受的作法。

  • 處理執行階段之間的互動,例如在執行階段之間傳遞的呼叫堆疊。

  • 處理多個實作在相同處理序中作用之 ICorProfilerCallback(2,3) 的類別執行個體。

程式碼剖析工具通常會提供單一程式碼剖析工具管理員物件,而這個物件會負責處理全域函式實作以及橫跨多個執行階段的資料。 例如:

程式碼剖析工具也必須提供實作 ICorProfilerCallback 介面的程式碼剖析工具物件。 CLR 會針對每個使用中執行階段執行個體化這個程式碼剖析工具物件一次。 程式碼剖析工具應該存取的唯一全域物件就是程式碼剖析工具管理員。 程式碼剖析工具不應該保留其 ICorProfilerCallback 實作的全域參考,因為當處理序包含多個執行個體時,許多 ICorProfilerCallback 實作的執行個體可能會處於使用中狀態。

啟用程式碼剖析工具

主要啟用工作就是讓程式碼剖析工具與執行階段版本產生關聯。

啟動程式碼剖析工具

如果您想要在給定處理序的所有執行階段中啟動程式碼剖析工具,請設定 COR_PROFILER 和 COR_ENABLE_PROFILING 環境變數 (在 .NET Framework 3.5 和先前的版本中,這個程序也相同)。

如果您只想要在特定執行階段中啟動程式碼剖析工具,請設定 COR_PROFILER 和 COR_ENABLE_PROFILING 環境變數,並進行下列其中一項作業:

  • 讓所有呼叫失敗,但 Class Factory 物件的第一個 CreateInstance 呼叫除外 (程式碼剖析第一個)。

    -或-

  • 允許 Class Factory 物件的所有 CreateInstance 呼叫,並且在 Initialize 呼叫中,判斷呼叫中執行階段的版本。 若要這麼做,您必須執行下列兩個動作:

    • 針對 ICorProfilerInfo3 介面的 CLR 執行 QueryInterface 方法。 如果這項作業失敗,表示執行階段版本為 1 或 2.0。 針對 ICorProfilerInfo2 介面執行 QueryInterface 將會顯示執行階段是 2.0 版執行階段或 1 版執行階段。

    • 如果支援 ICorProfilerInfo3,請呼叫 GetRuntimeInformation 方法來取得正在進行程式碼剖析之執行階段的詳細資訊。

    已經判斷出執行階段的版本之後,程式碼剖析工具就可以決定是否要對該執行階段進行程式碼剖析。 如果要,請依照一般方式繼續進行初始化。 如果不要,請從 Initialize 傳回錯誤。 從 .NET Framework 4 開始,程式碼剖析工具就可以傳回 CORPROF_E_PROFILER_CANCEL_ACTIVATION HRESULT,避免將錯誤記錄至 Windows 應用程式事件記錄檔。

附加程式碼剖析工具

附加觸發處理序會進行下列作業:

如需附加程式碼剖析工具的詳細資訊,請參閱附加和中斷連結程式碼剖析工具

請參閱

概念

分析概觀

其他資源

.NET Framework 4 中的程式碼剖析

Unmanaged API 參考