Especificación de los propietarios de módulos y funciones
Las extensiones !analyze y !owner usan un archivo denominado triage.ini para determinar el propietario de los símbolos que encuentra el depurador.
Cuando se usan estas extensiones, las identidades de la función o el propietario del módulo se muestran después de la palabra "Seguimiento".
El archivo triage.ini es un archivo de texto que reside en el subdirectorio \triage de la instalación de herramientas de depuración para Windows. Se incluye un archivo de triage.ini de ejemplo como parte del paquete Herramientas de depuración para Windows.
Advertencia Si instala una versión actualizada de Herramientas de depuración para Windows en el mismo directorio que la versión actual, sobrescribe todos los archivos de ese directorio, incluidos los triage.ini. Después de modificar o reemplazar el archivo de triage.ini de ejemplo, guarde una copia de él en un directorio diferente. Después de reinstalar los depuradores, puede copiar el triage.ini guardado a través de la versión predeterminada.
Formato del archivo de triage.ini
Aunque el archivo triage.ini está pensado para ayudarle a determinar el propietario de una función que se ha dividido en el depurador, las cadenas "owner" de este archivo pueden ser cualquier cosa que pueda ayudarle con la depuración. Las cadenas pueden ser nombres de personas que escribieron o mantienen el código. O bien, las cadenas pueden ser instrucciones cortas sobre lo que puede hacer cuando se produce un error en un módulo o una función.
Cada línea de este archivo tiene la sintaxis siguiente.
Module[!Function]=Owner
Solo puede agregar un asterisco (*) al final de un nombre de módulo o función. Si aparece en otro lugar, se interpreta como un carácter literal.
No se pueden agregar espacios en la cadena de propietario. Si los espacios existen en la cadena de propietario, se omiten.
Para obtener más información sobre las opciones de sintaxis, vea Sintaxis de triage.ini especial.
En los ejemplos siguientes se muestra un archivo triage.ini de ejemplo.
module1=Person1
module2!functionA=Person2
module2!functionB=Person3
module2!funct*=Person4
module2!*=Person5
module3!singleFunction=Person6
mod*!functionC=Person7
Triage.ini y !owner
Al pasar un nombre de módulo o función a la extensión !owner , el depurador muestra la palabra "Seguimiento" seguida del nombre del propietario del módulo o de la función.
En el ejemplo siguiente se usa el archivo triage.ini de ejemplo anterior.
0:000> !owner module2!functionB
Followup: Person3
Según el archivo, "Person3" posee module2!functionB y "Person4" posee module2!funct\. Ambas cadenas coinciden con el argumento que se pasa a !owner, por lo que se usa la coincidencia más completa.
Triage.ini y !analyze
Cuando se usa la extensión !analyze , el depurador examina el marco de error superior de la pila e intenta determinar el propietario del módulo y la función en este marco. Si el depurador puede determinar el propietario, se muestra la información del propietario.
Si el depurador no puede determinar el propietario, el depurador pasa al siguiente marco de pila, etc., hasta que el depurador determine el propietario o la pila se examine por completo.
Si el depurador puede determinar el propietario, el nombre del propietario se muestra después de la palabra "Seguimiento". Si el depurador busca en toda la pila sin encontrar ninguna información, no se muestra ningún nombre.
En el ejemplo siguiente se usa el archivo triage.ini de ejemplo que se proporciona anteriormente en este tema.
Supongamos que el primer fotograma de la pila es MyModule!someFunction. El depurador no encuentra MyModule en el archivo triage.ini. A continuación, continúa con el segundo marco de la pila.
Supongamos que el segundo fotograma es module3!anotherFunction. El depurador ve una entrada para module3, pero no hay ninguna coincidencia con anotherFunction en este módulo. A continuación, el depurador continúa hasta el tercer fotograma.
Supongamos que el tercer fotograma es module2!functionC. El depurador busca primero una coincidencia exacta, pero dicha coincidencia no existe. A continuación, el depurador recorta el nombre de la función y detecta module2!funct\* en triage.ini. Esta coincidencia finaliza la búsqueda, porque el depurador determina que el propietario es "Person4".
A continuación, el depurador muestra una salida similar al ejemplo siguiente.
0:000> !analyze
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
Use !analyze -v to get detailed debugging information.
Probably caused by : module2 ( module2!functionC+15a )
Followup: Person4
---------
Una coincidencia más completa tiene prioridad sobre una coincidencia más corta. Sin embargo, siempre se prefiere una coincidencia de nombre de módulo a una coincidencia de nombre de función. Si module2!funct\* no hubiera estado en este archivo de triage.ini, el depurador habría seleccionado module2!\* como coincidencia. Y si se quitaron module2!funct\* y module2!\*, se habría seleccionado mod*!functionC .
Sintaxis de triage.ini especial
Si omite el signo de exclamación y el nombre de la función o agrega !\* después de un nombre de módulo, se indican todas las funciones de ese módulo. Si también se especifica una función dentro de este módulo por separado, la especificación más precisa tiene prioridad.
Si usa "default" como nombre de módulo o nombre de función, equivale a un carácter comodín. Por ejemplo, nt!\* es el mismo que nt!default y el valor predeterminado es el mismo que *!\*.
Si se realiza una coincidencia, pero la palabra ignore aparece a la derecha del signo igual (=), el depurador continúa con el siguiente marco de la pila.
Puede agregar last_ o maybe_ antes del nombre de un propietario. Este prefijo proporciona al propietario menos prioridad al ejecutar !analyze. El depurador elige una coincidencia definitiva que es inferior en la pila en una maybe_ coincidencia que es mayor en la pila. El depurador también elige una coincidencia de maybe_ que es inferior en la pila en un last_ coincidencia que es mayor en la pila.
Ejemplo de triage.ini
En el paquete Herramientas de depuración para Windows se incluye una plantilla de triage.ini de ejemplo. Puede agregar los propietarios de todos los módulos y funciones que desee en este archivo. Si desea no tener ningún valor predeterminado global, elimine la línea default=MachineOwner al principio de este archivo.