Указание владельцев модулей и функций
Расширения !analyze и !owner используют файл с именем triage.ini, чтобы определить владельца символов, с которыми сталкивается отладчик.
При использовании этих расширений удостоверения владельца функции или модуля отображаются после слова "Отслеживание".
Файл triage.ini — это текстовый файл, который находится в подкаталоге \triage установки средств отладки для Windows. Пример файла 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 отладчик отображает слово "Отслеживание", за которым следует имя владельца модуля или функции.
В следующем примере используется предыдущий пример файла triage.ini.
0:000> !owner module2!functionB
Followup: Person3
Согласно файлу, "Person3" владеет module2!functionB, а "Person4" — module2!funct\. Обе эти строки соответствуют аргументу , передаваемого в !owner, поэтому используется более полное соответствие.
Triage.ini и !analyze
При использовании расширения !analyze отладчик просматривает верхний кадр сбоя в стеке и пытается определить владельца модуля и функции в этом кадре. Если отладчик может определить владельца, отображаются сведения о владельце.
Если отладчик не может определить владельца, отладчик переходит к следующему кадру стека и т. д., пока отладчик не определит владельца или стек не будет полностью проверен.
Если отладчик может определить владельца, имя владельца отображается после слова "Отслеживание". Если отладчик выполняет поиск по всему стеку без поиска каких-либо сведений, имя не отображается.
В следующем примере используется пример файла triage.ini, приведенный ранее в этом разделе.
Предположим, что первым кадром в стеке является MyModule!someFunction. Отладчик не находит MyModule в файле triage.ini. Затем он переходит ко второму кадру в стеке.
Предположим, что второй кадр — module3!anotherFunction. Отладчик видит запись для module3, но в этом модуле нет совпадения с другойfunction . Затем отладчик переходит к третьему кадру.
Предположим, третий кадр — module2!functionC. Сначала отладчик ищет точное совпадение, но такого совпадения не существует. Затем отладчик обрезает имя функции и обнаруживает module2!funct\* в triage.ini. Это совпадение завершает поиск, так как отладчик определяет, что владельцем является 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!\* в качестве соответствия. И если бы оба модуля!funct\* и module2!\* были удалены, был бы выбран mod*!functionC .
Специальный синтаксис triage.ini
Если опустить восклицательный знак и имя функции или добавить !\* после имени модуля, будут указаны все функции в этом модуле. Если функция в этом модуле также указана отдельно, приоритет имеет более точная спецификация.
Если вы используете "default" в качестве имени модуля или функции, это эквивалентно подстановочным знакам. Например, nt!\* совпадает с nt!default, а значение по умолчанию совпадает с *!\*.
Если совпадение выполнено, но слово ignore отображается справа от знака равенства (=), отладчик переходит к следующему кадру в стеке.
Вы можете добавить last_ или maybe_ перед именем владельца. Этот префикс дает владельцу меньший приоритет при запуске !analyze. Отладчик выбирает определенное соответствие, которое ниже в стеке, чем maybe_ совпадение, которое выше в стеке. Отладчик также выбирает maybe_ соответствие, которое ниже в стеке по сравнению с last_ совпадением, которое выше в стеке.
Пример triage.ini
Пример шаблона triage.ini включен в пакет Средств отладки для Windows. В этот файл можно добавить владельцев любых модулей и функций. Если вы хотите, чтобы глобальное значение по умолчанию не было, удалите строку default=MachineOwner в начале этого файла.