Partilhar via


Determinar Proprietários de Módulo e Função

As extensões !analyze e !owner usam um arquivo chamado triage.ini para determinar o proprietário dos símbolos que o depurador encontra.

Quando você usa essas extensões, as identidades do proprietário da função ou módulo são exibidas após a palavra "Followup".

O arquivo triage.ini é um arquivo de texto que reside no subdiretório \triage da instalação do Debugging Tools for Windows. Um exemplo de arquivo triage.ini está incluído como parte do pacote Ferramentas de Depuração para Windows.

Advertência Se você instalar uma versão atualizada das Ferramentas de Depuração para Windows no mesmo diretório da versão atual, ela substituirá todos os arquivos nesse diretório, incluindo triage.ini. Depois de modificar ou substituir o arquivo de triage.ini de exemplo, salve uma cópia dele em um diretório diferente. Depois de reinstalar os depuradores, você pode copiar o triage.ini salvo sobre a versão padrão.

Formato do ficheiro triage.ini

Embora o arquivo triage.ini se destine a ajudá-lo a determinar o proprietário de uma função que entrou no depurador, as cadeias de caracteres "proprietário" neste arquivo podem indicar qualquer coisa que o ajude na depuração. As cadeias de caracteres podem ser nomes de pessoas que escreveram ou mantêm o código. Ou, as cadeias de caracteres podem ser instruções curtas sobre o que você pode fazer quando ocorre um erro em um módulo ou função.

Cada linha neste ficheiro tem a seguinte sintaxe.

Module[!Function]=Owner 

Você pode adicionar um asterisco (*) somente no final do nome de um módulo ou função. Se aparecer em outro lugar, é interpretado como um caractere literal.

Não é possível adicionar espaços na cadeia de caracteres do proprietário. Se existirem espaços na cadeia de caracteres do proprietário, eles serão ignorados.

Para obter mais informações sobre opções de sintaxe, consulte Sintaxe de triage.ini especial.

Os exemplos a seguir mostram um arquivo de triage.ini de exemplo.

module1=Person1
module2!functionA=Person2
module2!functionB=Person3
module2!funct*=Person4
module2!*=Person5
module3!singleFunction=Person6
mod*!functionC=Person7

Triage.ini e !owner

Quando você passa um nome de módulo ou função para a extensão !owner , o depurador exibe a palavra "Followup" seguida pelo nome do proprietário do módulo ou função.

O exemplo a seguir usa a amostra anterior do ficheiro triage.ini.

0:000> !owner module2!functionB
Followup:  Person3

De acordo com o arquivo, "Person3" possui module2!functionB, e "Person4" possui module2!funct\. Ambas as cadeias de caracteres correspondem ao argumento que é passado para !owner, portanto, a correspondência mais completa é usada.

Triage.ini e !analisar

Quando utiliza a extensão !analyze, o depurador examina o primeiro frame com falha na pilha e tenta determinar o controlador do módulo e da função nesse frame. Se o depurador puder determinar o proprietário, as informações do proprietário serão exibidas.

Se o depurador não puder determinar o proprietário, o depurador passará para o próximo quadro de pilha, e assim por diante, até que o depurador determine o proprietário ou a pilha seja completamente examinada.

Caso o depurador consiga identificar o proprietário, o nome do proprietário será apresentado após a palavra "Acompanhamento". Se o depurador pesquisar toda a pilha sem encontrar nenhuma informação, nenhum nome será exibido.

O exemplo a seguir usa o arquivo de triage.ini de exemplo fornecido anteriormente neste tópico.

Suponha que o primeiro quadro na pilha é MyModule!someFunction. O depurador não encontra MyModule no arquivo triage.ini. Em seguida, continua para o segundo quadro na pilha.

Suponha que o segundo quadro seja module3!anotherFunction. O depurador vê uma entrada para module3, mas não há correspondência para anotherFunction neste módulo. Em seguida, o depurador continua para o terceiro quadro.

Suponha que o terceiro quadro seja module2!functionC. O depurador primeiro procura uma correspondência exata, mas essa correspondência não existe. Em seguida, o depurador corta o nome da função e descobre module2!funct\* em triage.ini. Esta correspondência encerra a pesquisa, pois o depurador determina que o proprietário é "Person4".

Em seguida, o depurador exibe uma saída semelhante ao exemplo a seguir.

0:000> !analyze
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

Probably caused by : module2 ( module2!functionC+15a )

Followup: Person4
---------

Uma partida mais completa tem precedência sobre uma partida mais curta. No entanto, uma correspondência de nome de módulo é sempre preferível a uma correspondência de nome de função. Se module2!funct\* não estivesse neste arquivo triage.ini, o depurador teria selecionado module2!\* como a correspondência. E se ambos module2!funct\* e module2!\* fossem removidos, mod*!functionC teria sido selecionado.

Sintaxe triage.ini especial

Se você omitir o ponto de exclamação e o nome da função ou adicionar !\* após o nome de um módulo, todas as funções nesse módulo serão indicadas. Se uma função dentro deste módulo também é especificada separadamente, a especificação mais precisa tem precedência.

Se você usar "default" como um nome de módulo ou um nome de função, ele será equivalente a um caractere curinga. Por exemplo, nt!\* é o mesmo que nt!default, e default é o mesmo que *!\*.

Se uma correspondência for feita, mas a palavra ignorar aparecer à direita do sinal de igual (=), o depurador passa para o próximo quadro na pilha.

Você pode adicionar last_ ou maybe_ antes do nome de um proprietário. Este prefixo dá ao proprietário menos prioridade quando você executa !analyze. O depurador escolhe uma correspondência definida que está mais abaixo na pilha em vez de uma correspondência maybe_ que está mais acima na pilha. O depurador também escolhe uma correspondência maybe_ que está mais baixa na pilha em vez de uma correspondência last_ que está mais alta na pilha.

Exemplo triage.ini

Um modelo de exemplo triage.ini está incluído no pacote de Ferramentas de Depuração para Windows. Você pode adicionar os proprietários de quaisquer módulos e funções que desejar a este arquivo. Se você quiser não ter nenhum padrão global, exclua a linha default=MachineOwner no início deste arquivo.