!analyze 和 !owner 延伸模組會使用名為 triage.ini 的檔案來判斷調試程式遇到的符號擁有者。
當您使用這些擴充功能時,函式或模組擁有者的身分識別會顯示在 「Followup」 一詞之後。
triage.ini 檔案是位於 Windows 偵錯工具的 \triage 子目錄中的文本檔。 範例 triage.ini 檔案包含在 Windows 套件的偵錯工具中。
警告 如果您在與目前版本相同的目錄中安裝 Windows 偵錯工具的更新版本,它會覆寫該目錄中的所有檔案,包括 triage.ini。 在您修改或取代範例 triage.ini 檔案之後,請將它的複本儲存至不同的目錄。 重新安裝調試器之後,您可以將已儲存的 triage.ini 複製到預設版本上。
triage.ini 檔案的格式
雖然 triage.ini 檔案旨在協助您判斷已中斷至除錯器的函式擁有者,但此檔案中的「擁有者」字串可以是任何可能有助於除錯的內容。 字串可以是撰寫或維護程式代碼的人員名稱。 或者,字串可以是您在模組或函式中發生錯誤時可以執行的簡短指示。
此檔案中的每個行都有下列語法。
Module[!Function]=Owner
您只能在模組或函式名稱的結尾新增星號 。 如果它出現在其他地方,則會將其解譯為字面字元。
您無法在擁有者字串中新增空白。 如果擁有者字串中確實存在空格,則會忽略它們。
如需語法選項的詳細資訊,請參閱 特殊 triage.ini 語法。
下列範例顯示範例 triage.ini 檔案。
module1=Person1
module2!functionA=Person2
module2!functionB=Person3
module2!funct*=Person4
module2!*=Person5
module3!singleFunction=Person6
mod*!functionC=Person7
Triage.ini 和 !owner
當您將模組或函式名稱傳遞至 !owner 擴充功能時,調試程式會顯示 “Followup” 這個字,後面接著模組或函式擁有者的名稱。
下列範例會使用先前的範例 triage.ini 檔案。
0:000> !owner module2!functionB
Followup: Person3
根據檔案,“Person3” 擁有 module2!functionB,而 “Person4” 擁有 module2!funct\。 這兩個字串都符合傳遞至 !owner 的自變數,因此會使用更完整的比對。
Triage.ini 和 !analyze
當您使用 !analyze 擴充功能時,調試程式會查看堆疊中的頂端錯誤框架,並嘗試判斷此框架中模組和函式的擁有者。 如果調試程式可以判斷擁有者,則會顯示擁有者資訊。
如果調試程式無法判斷擁有者,調試程式會傳遞至下一個堆疊框架等等,直到調試程式判斷擁有者或堆疊完全檢查為止。
如果調試程式可以判斷擁有者,則擁有者名稱會顯示在 「Followup」 一詞之後。 如果調試程式在不尋找任何資訊的情況下搜尋整個堆疊,則不會顯示任何名稱。
下列範例會使用本主題稍早提供的範例 triage.ini 檔案。
假設堆棧上的第一個框架是 MyModule!someFunction。 調試程式在 triage.ini 檔案中找不到 MyModule 。 接下來,它會繼續至堆疊上的第二個框架。
假設第二個框架是 module3!anotherFunction。 除錯器確實看到了 module3 的項目,但在該模組中找不到 另一個功能 的相符項目。 接下來,調試程式會繼續進行第三個畫面。
假設第三個框架是 module2!functionC。 調試程式會先尋找完全相符專案,但這類相符專案不存在。 然後除錯程式會修剪函式名稱,並在 triage.ini中探索 module2!funct\* 。 此比對會結束搜尋,因為調試程式會判斷擁有者為 “Person4”。
然後調試程式會顯示類似下列範例的輸出。
0:000> !analyze
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
Use !analyze -v to get detailed debugging information.
Probably caused by : module2 ( module2!functionC+15a )
Followup: Person4
---------
較完整的比對將優先於較短的比對。 不過,模組名稱比對一律優先於函式名稱比對。 如果 module2!funct\* 未在此 triage.ini 檔案中,調試程式會選取 module2!\* 作為相符專案。 如果已移除 module2!funct\* 和 module2!\* ,則會選取 mod*!functionC 。
特殊 triage.ini 語法
如果您省略驚嘆號和函式名稱,或在模組名稱後面新增 !\* ,則會指出該模組中的所有函式。 如果此模組內的函式也另外指定,則更精確的規格優先。
如果您使用 「default」 作為模組名稱或函式名稱,它相當於通配符。 例如,nt!\* 等同於 nt!default,default 等同於 *!\*。
如果進行比對,但字 忽略 出現在等號(=)右邊,除錯器會繼續到堆疊中的下一框。
您可以在擁有者名稱之前新增 last_ 或 maybe_ 。 在您執行 !analyze 時,這個前綴將讓擁有者的優先順序降低。 調試器會選擇堆疊中較低的明確比對,而不是堆疊中較高的 maybe_ 比對。 調試程式也會選擇堆疊上較低的 maybe_ 比對,而不是選擇堆疊上較高的 last_ 比對。
範例 triage.ini
Windows 偵錯工具套件中包含範例 triage.ini 範本。 您可以新增您想要此檔案之任何模組和函式的擁有者。 如果您想要沒有全域預設值,請刪除此檔案開頭的 default=MachineOwner 行。