共用方式為


分析和執行階段通知識別碼

執行階段告知會提供已報告之類別、執行緒、應用程式定義域等的 ID。 這些 ID 可用於查詢 Common Language Runtime (CLR),以取得詳細資訊。 每個 ID 都是記憶體中說明項目的區塊位址。 不過,分析工具應將 ID 視為不透明的控制代碼。 如果在分析函式的呼叫中使用無效 ID,結果是未定義的。 結果極有可能是存取違規。 分析工具必須確定使用有效的 ID。 分析 API 不會執行任何類型的驗證,因為這會造成額外負荷,並會讓應用程式執行變得相當慢。

下列各節將會說明分析 API 中的 ID 特性。

唯一性

ProcessID 對處理序存留期而言是唯一具有系統範圍的。 所有其他 ID 都是在 ID 存留期中唯一具有處理序範圍。

階層架構和內含項目

在階層架構中的 ID 以反映處理序階層架構的方式排列。 處理序包含應用程式定義域、應用程式定義域包含組件、組件包含模組、模組包含類別、類別包含函式。 執行緒包含在處理序中,而且可在應用程式定義域之間移動。 物件大多包含在應用程式定義域中,而且極少數的物件可能同時是多個應用程式定義域的成員。 內容包含在處理序中。

存留期和穩定性

當指定的處理序、應用程式定義域、組件、執行緒或物件終結、釋放或結束時,相關 ID 就會變成無效。 當指定的 ID 變成無效時,它包含的所有 ID 也會變成無效。 例如,當卸載應用程式定義域時,它的 AppDomainID 會變成無效。 對應至應用程式定義域內之組件、模組、類別和函式的 AssemblyID、ModuleID、ClassID 和 FunctionID 同時也會變成無效。

特定 ID 的存留期和穩定性如下:

應用程式定義域相似性

處理序中的每個使用者建立的應用程式定義域都有 AppDomainID。 預設定義域和用於保存定義域中性組件的特殊虛擬定義域也有 AppDomainID。

組件、模組、類別、函式和記憶體回收行程控制代碼都有應用程式定義域相似性。 這表示,如果組件載入多個應用程式定義域中,組件及其所有模組、類別、函式和記憶體回收行程控制代碼在每個應用程式定義域中都會有不同 ID,而且每個 ID 上的作業只會在相關應用程式定義域中生效。 定義域中性組件會出現在上述的特殊虛擬定義域中。

其他注意事項

除了 ObjectID,所有 ID 都應被視為不透明的值。 大多數 ID 的意義相當明顯。 下列 ID 值得詳細說明:

  • ClassID 表示類別。 如果是泛型類別,它們表示已完全執行個體化的型別。 List<int>、List<char>、List<object> 和 List<string> 各有其 ClassID。 List<T> 是未執行個體化的型別,沒有 ClassID。 Dictionary<string,V> 是已部分執行個體化的型別,沒有 ClassID。

  • FunctionID 表示函式的機器碼。 如果是泛型函式 (或泛型類別上的函式),指定的函式可能有多個機器碼執行個體化,因此也有多個 FunctionID。 不同型別可能會共用機器碼執行個體化 (例如,List<string> 和 List<object> 會共用程式碼),因此 FunctionID 可能屬於多個 ClassID。

  • ObjectID 表示記憶體回收的物件。 ObjectID 是分析工具接收 ObjectID 時物件的目前位址,可能會隨著每個記憶體回收而變更。 因此,ObjectID 值只在接收它時和下次記憶體回收開始時的這段時間內有效。 CLR 也會告知分析工具更新它內部的物件追蹤對應,以便分析工具能跨記憶體回收維持有效的 ObjectID。

  • GCHandleID 表示記憶體回收控制代碼表格中的項目。 不同於 ObjectID,GCHandleID 是不透明的值。 記憶體回收控制代碼有時是由 CLR 本身建立的,或透過 GCHandle 結構來建立 (請注意,GCHandle 結構只表示控制代碼,控制代碼並不包含在此結構中)。

  • ThreadID 表示 Managed 執行緒。 如果主應用程式支援 Fiber 模式執行,根據檢查時間,Managed 執行緒可能存在於不同的作業系統執行緒上。

    注意事項注意事項

    .NET Framework 2.0 版不支援分析 Fiber 模式的應用程式。

請參閱

概念

分析概觀