Capítulo 10 – Instrumentación–Parte 1

 
Lección 1 – Logueando eventos
Es casi imposible saber de antemano todas las situaciones que pueden surgir después de que se implementa la aplicación, la forma de averiguarlo es usando un event log.
Usando Microsoft Windows Events y logueandolos
Es común tener informes de problemas de los usuarios utilizando la terminología que los desarrolladores no entendemos.
 Ej: hice clic en esa ventanita de acá, se me puso blanca y me salto un cartel….Molesto
La falta de comunicación hace de la comprobación de errores un proceso difícil. Una forma de controlar esto, es el registro de sucesos, estos proporcionan un mecanismo para que las aplicaciones registren las cosas que les suceden.
Esta característica tiene muchos beneficios. Al utilizar el registro de sucesos, los desarrolladores pueden guardar determinados aspectos del estado de una solicitud, incluyendo errores graves. Se pueden grabar casi cualquier cosa.
Visor de eventos de Windows XP:
image
 
Creando y borrando un Event Log
Para crear un event log. Net Framework provee la clase EventLog. Para usarla se debe referenciar el namespace System.Diagnostics:
image
Después de crear un EventLog y especificar el source (de donde toma los datos, en este caso Cap10), se puede ver su información en el visor de eventos de Windows después de ejecutar el codigo.
Borrar un Eventlog es igual de simple:
image

 
Escribiendo un Event Log
El método WriteEntry parece bastante simple, pero existen 10 sobrecargas de este método:
image
 
Además de leer logs personalizados, el objeto EventLog permite leer y escribir en Evenlogs existentes como los de seguridad y logs de sistema.
Ejemplo de cómo escribir dentro de estos: (se deben tener permisos de escritura)
Aplication Log:
image
SecurityLog:
image
SystemLog:
image
 
Leyendo un Event Log
Los objetos event logs tienen una propiedad Entries, que es una instancia de EventLogEntryCollection, esta nos permite iterar a través de ella y ver los EventLogEntry que contiene:
image
La forma de limpiarlo es llamando al método clear del objeto Eventlog.
image
 
Lección 2 - Depurando y la trazando
Escribiendo Salidas (Output)
Una función importante de los desarrolladores es recorrer el código y buscar errores. Aprender a utilizar eficazmente las herramientas disponibles para esta tarea es fundamental por muchas razones:
  • · Para comprobar que el código hace lo que se espera.
  • · Si usamos las clases Debug y Debugger se puede obtener un feedback para confirmar si funciona como lo planeado.
  • · Usando herramientas para localizar los errores después de que han surgido
Las dos clases fundamentales utilizados para la depuración, Debug y Debugger, se encuentran en el namespace System.Diagnostics.
 
La clase Debugger
Permite la comunicación con una aplicación debugeadora. Tiene múltiples miembros:
Metodos:
Nombre Descripción
Break detiene la ejecución del depurador
IsAttached indica cuando el depurador está asociado a un proceso.
isLogging indica si el depurador se encuentra en el registro.
Launch lanza el depurador y lo asocia a un proceso
Log envía un mensaje al depurador actual
Ejemplo del uso del método break dentro de una sentencia condicional:
image
Otro método importante en la clase debugger es el método Log, que envía información a un depurador asociado, si no se encuentra asociado a ninguno, no realiza nada.
Cuando usamos el método log, este escribe en cualquier objeto que escuche y este asociado al debugger.para usar este método se debe llamarlo e indicar el nivel, categoría y mensaje (en listener simple es el DefaultTraceListener):
image
La clase Debug
Aunque la clase Debugger es muy útil, que, sólo ofrece dos métodos (break y log) y hay momentos en que necesita más granularidad. En esos casos, la clase de debug se ajusta mejor
Metodos:
Nombre Descripción
Assert Evalúa una condición y muestra un mensaje si la condición es falsa.
Close Vacía el búfer de salida y luego llama al método Close en cada uno de los oyentes (listeners) conectados.
Fail Muestra un mensaje de error. Vacía el búfer de salida, y escribe la información en la colección Listeners.
Indent Incrementa el nivelde incidencia. Este método es especialmente útil para dar formato.
Imprimir Escribe un mensaje seguido de un terminador de línea para rastrear a los oyentes de la colección Listeners.
Unindent Opuesto del método Incident. Disminuye el nivel de incidencia en una unidad.
Write Escribe la información adjunta sobre depuración u objetos de la clase Trace escucha de la colección Listeners.
WriteIf Lleva a cabo la misma acción que el método Write, pero lo hace
sólo si la condición especificada se cumple.
WriteLine Escribe información adjunta de los debuggers o de seguimiento de los Listeners.
WriteLineIf Realiza la misma acción que el método WriteLine, pero lo hace sólo si la condición especificada se cumple
 
El método Assert
Uno de los beneficios del uso de estas clases es que permite llevar a cabo su aplicación y examinar la salida sin tener que pasar manualmente a través del código. Una de las mejores herramientas para ayudar a depurar es el método Assert. Se debe colocar el código con los métodos Debug.Assert con una condición verdadera o falsa. si la condición no es cierta, se romperá en el depurador automáticamente. Cuando se utiliza correctamente el metodo Assert, simplemente ejecuta la aplicación y se produce una notificación inmediata frente a un problema.
Ejemplo estamos usando un objeto IConfigurationSectionHandler y alguien ha eliminado la entrada en el archivo de configuración. Sin una afirmación de depuración, puede pasar 20 minutos tratando de localizar el objeto antes de darse cuenta de que alguien lo elimino.
Suponga que tenemos un archivo de configuración, pero los ajustes fueron eliminado:
image
Referenciando al namespace System.Diagnostics se podrá saber inmediatamente:
image
Si no se encuentran los valores, se mostrara un mensaje de aviso.
El método fail, es un método que causa que la clase debugger haga un break y muestre un mensaje:
image
 
En cada uno de estos escenarios, el cuadro de diálogo presenta tres opciones :
■ Abort: Detiene la ejecución del programa completo.
■ Retry : reintenta ejecutar el bloque de código nuevo.
■ Ignore: Salta la falla, y trata de reanudar la ejecución.
 
El método Write
Se llama seguido del mensaje que se quiere mostrar:
image
 
El método Writeif
Trabaja de forma idéntica al write, salvo lo realiza solo si se cumple una condición:
image
Los métodos WriteLine y WriteLineIf funcionan de manera similar a estos anteriores, salvo que además contienen un terminador de línea al final del mensaje.
 
El método Print
Funciona de forma similar a los métodos writes, solo que escribe si se encuentra enlazado a un objeto listener.
image
Método flush
Es usado para introducir todos los datos en un objeto listener. No necesita parámetros, solo se llama:
image
Atributos de debug
Son atributos que permiten especificar la forma en que la aplicación se debe comportar.
Un atributo, describe el comportamiento de un objeto y llamadas de este de antemano para saber cómo manejar la situación. Debido a esta capacidad, los atributos están particularmente bien adaptados a escenarios de depuración.
Atributos:
  • DebuggerBrowsableAttribute
  • DebuggerDisplayAttribute
  • DebuggerHiddenAttribute
  • DebuggerNonUserCodeAttribute
  • DebuggerStepperBoundaryAttribute
  • DebuggerStepThroughAttribute
  • DebuggerTypeProxyAttribute
  • DebuggerVisualizerAttribute
Ejemplo: una clase simple a la que se puede hacer referencia antes y después de agregar los atributos que acabo de mencionar, SoftwareCompany: con 3 propiedades públicas (CompanyName, CompanyCity y CompanyState) , tres variables privadas (_companyName, _companyCity y _companyState) y un constructor sobrecargado que permite pasar en cada uno de estos valores:
image
Si le pasamos datos:
image
Y le hacemos un breakpoint, vamos a observar los miembros públicos y los privados.
image
 
DebuggerBrowsableAttribute
image

Si en los miembros privados agregamos el atributo DebuggerBrowsableAttribute, y establecemos la enumeración DebuggerBrowsableState en nunca ( siempre Usando el namespace Sytems.Diagnostics), y volvemos a poner un breakpoint, al ejecutar la aplicación, se ve el siguiente cuadro:
image

La enumeración DebuggerBrowsableState
Valores:
Never El elemento nunca esta visible
Collapsed Muestra el elemento colapsado.
RootHidden No muestra el elemento principal pero si los elementos hijos.
 
DebuggerDisplayAttribute
Colocando sobre el nombre de la clase el atributo DebuggerDisplay podemos formatear como queremos que se muestre el elemento principal:
image
Se vería de esta forma:
image

DebuggerHiddenAttribute y DebuggerNonUserCodeAttribute El propósito de estas, es que si se tiene un punto de interrupción establecido, en el momento de ejecutarlo es simplemente ignorado.

DebuggerStepperBoundaryAttribute
Se utiliza este atributo cuando algo creado por el diseñador contiene una o más propiedades o métodos de interés. Le permite ver una parte del código sin tener que ver todo lo demás.
 
DebuggerTypeProxyAttribute
Permite cambiar cómo un tipo determinado se muestra. Este atributo se usa normalmente cuando se tiene un tipo interno y desea tener control sobre cómo aparecen:
image

 
DebuggerVisualizerAttribute
Este atributo le indica al depurador que tiene un visualizador asociado para la clase dada.
Creación de agentes listeners Siempre se habló de la salida del depurador pero, ninguno de estos métodos tiene ningún valor sin estar asociado a un listener. Las dos clases principales más usadas son Trace y Debug que se utilizan de forma idéntica, la diferencia está en que trace se realiza en la compilación tanto en Release como Debug, mientras que de debug es sólo en debug.
Los métodos más usados son:
Nombre Descripcion
AutoFlush Para obtener o establecer si el objeto se vacía después de cada escritura.
Close Vacía el búfer de salida, y cierra todos los listeners asociados
Fail emite un mensaje de error con la información sobre este
Flush Vacía el búfer y escribe la salida a todos los objetos listeners
Listeners obtiene la colección de listeners que monitorea
TraceInformation muestra mensajes de información de todo lo que sucede
Para ver el resto de sus métodos aqui.
 
Objetos listeners (oyentes)
Las clases Debug y Trace dependen de los objetos listeners, ya que estos son los que toman sus datos y los dejan analizar. De forma predeterminada, Visual Studio asigna un listener que envía los datos a la ventana de salida.
 
La clase DefaultTraceListener
Los oyentes pueden añadir de forma manual o mediante el archivo de configuración. Ejemplo de cómo añadir una DefaultTraceListener:
image
O en el archivo de configuración:
image
 
Clase TextWriterTraceListener
Es uno de los listeners más simples de usar y sirve para escribir la salida a un archivo de texto o un stream:
image
O por el archivo de configuración:
image
 
Clase XmlWriterTraceListener
Envía la información recibida, a un objeto TextWriter o un objeto Stream. Para ver un poco de información sobre sus métodos aquí. Se crea de la siguiente manera:
image
O en el archivo de configuración:
image.




 ....................................................................................................................................................
2da parte >> 
.....................................................................................................................................................

No hay comentarios:

Publicar un comentario