Partilhar via


Especificando 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 da função ou do proprietário do módulo são exibidas após a palavra "Acompanhamento".

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

Aviso Se você instalar uma versão atualizada das Ferramentas de Depuração para Windows no mesmo diretório que a 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ê poderá copiar o triage.ini salvo na versão padrão.

Formato do arquivo triage.ini

Embora o arquivo triage.ini se destine a ajudá-lo a determinar o proprietário de uma função que foi dividida no depurador, as cadeias de caracteres "proprietário" neste arquivo podem ser qualquer coisa que possa ajudá-lo 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 arquivo tem a seguinte sintaxe.

Module[!Function]=Owner 

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

Não é possível adicionar espaços na cadeia de caracteres do proprietário. Se houver espaços na cadeia de caracteres de 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 módulo ou nome de função para a extensão !owner , o depurador exibe a palavra "Acompanhamento" seguida pelo nome do módulo ou do proprietário da função.

O exemplo a seguir usa o arquivo de triage.ini de exemplo anterior.

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

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

Triage.ini e !analyze

Quando você usa a extensão !analyze , o depurador examina o quadro com falha superior na pilha e tenta determinar o proprietário do módulo e da função nesse quadro. Se o depurador puder determinar o proprietário, as informações de 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.

Se o depurador puder determinar o proprietário, o nome do proprietário será exibido 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 que é dado anteriormente neste tópico.

Suponha que o primeiro quadro na pilha seja MyModule!someFunction. O depurador não encontra MyModule no arquivo triage.ini. Em seguida, ele 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 outraFunction 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. Essa 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 correspondência mais completa tem precedência sobre uma correspondência mais curta. No entanto, uma correspondência de nome de módulo sempre é preferencial para 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 os módulos2!funct\* e module2!\* foram removidos, mod*!functionC teria sido selecionado.

Sintaxe de triage.ini especial

Se você omitir o ponto de exclamação e o nome da função ou adicionar !\* após um nome de módulo, todas as funções nesse módulo serão indicadas. Se uma função dentro deste módulo também for especificada separadamente, a especificação mais precisa terá 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 o padrão é o mesmo que *!\*.

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

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

Exemplo de triage.ini

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