Saltar al contenido

“depurando” tu aplicación en tiempo de ejecución (parte 2/2)

11 enero, 2012

Tras el tutorial anterior hemos visto una forma para entrar a modo “depuración” en tiempo de ejecución . Sin embargo lo importante del modo de depuración es darse cuenta de los eventos que ocurren para determinar algún funcionamiento erroneo, para muchos es conocido el uso de:

MessageBox.show("mensaje");

Como herramienta que permite visualizar en un cuadro de diálogo emergente un mensaje cualquiera, esta opción es conveniente en algunos casos (que veremos en un post futuro) pero no es muy buena idea para un proceso de depuración puesto que es bastante invasivo y puede resultar molesto. Por esto haremos uso del componente EventLog el cual nos permitirá llevar registro de las actividades de nuestra aplicación de forma “silenciosa”, almacenar esa información y procesarla desde el visor de eventos de windows. Pero vamos por partes, primero se debe agregar el elemento eventlog a tu aplicación (para esto usaré la misma aplicación del tutorial anterior) y para esto debes arrastrar de la barra de componentes el control evenlog tal como se ve en el siguiente video:

Ahora el diseñador debe quedar de la siguiente manera:

namespace HolaMundoDebug
{
    partial class Form1
    {
        /// <summary>
        /// Variable del diseñador requerida.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Limpiar los recursos que se estén utilizando.
        /// </summary>
        /// <param name="disposing">true si los recursos administrados se deben eliminar; false en caso contrario, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Código generado por el Diseñador de Windows Forms

        /// <summary>
        /// Método necesario para admitir el Diseñador. No se puede modificar
        /// el contenido del método con el editor de código.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.eventLog1 = new System.Diagnostics.EventLog();
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(95, 105);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.button1.MouseLeave += new System.EventHandler(this.Button1_Mouseleave);
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(92, 52);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(35, 13);
            this.label1.TabIndex = 1;
            this.label1.Text = "label1";
            // 
            // eventLog1
            // 
            this.eventLog1.SynchronizingObject = this;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Label label1;
        private System.Diagnostics.EventLog eventLog1; //este es la bitácora de eventos
    }
}

Donde puede verse que se ha agregado una instancia de la clase System.Diagnostics.EventLog llamada eventLog1 ese será el objeto que manipularemos para nuestra depuración. Como siempre que se trabaja con una clase nueva, es recomendable conocer su documentación, sin embargo algunas consideraciones se harán a lo largo de este documento.

pasando ya a la parte sustancial de este artículo iniciemos por el constructor, al iniciar la aplicación es muy buena práctica (en algunos casos es una obligación) inicializar los componentes, por lo tanto en el constructor de la aplicación debe hacerse lo propio con el eventlog1 que acabamos de crear, y antes de esto crear la fuente e eventos; entonces el constructor de la aplicación quedará así:

public Form1()
        {
            
            //inicialización de fuente
            if (!System.Diagnostics.EventLog.SourceExists("hola mundo"))
                            System.Diagnostics.EventLog.CreateEventSource("bitacora", "hola mundo");
         //inicialización de eventLog1
            eventLog1 = new System.Diagnostics.EventLog("", Environment.MachineName,"hola mundo");
                
            //esta línea convierte el valor de tu clave DEBUG, en un valor booleano
            _DEBUG = Convert.ToBoolean(ConfigurationManager.AppSettings["DEBUG"]);

            // ahora esta línea le agrega al título de la ventana el texto "(debug)" en caso que estés en modo de depuración.
            if (_DEBUG)
                this.Text += " (debug)";
            
        }

En primer lugar se verifica la fuente de eventos y en caso de no existir se crea mediante el método createEventSource , que recibe como parámetros el nombre del registro (en nuestro caso “bitacora” y el nombre de la fuente)

He usado el constructor mas largo de System.Diagnostics.EventLog , para dar a conocer todos los parámetros involucrados, si se hace un análisis detallado el constructor que se usó es de la forma:

new public EventLog (string logName, string machineName, string source)

Donde:
Source es el nombre de origen que se va a registrar y utilizar al escribir en el registro de eventos.
logName es el nombre del registro a manipular (se deja en blanco, porque ya se hozo la asociación entre el registro y la fuente en la creación de la segunda). y
machineName es el nombre del equipo en el que se van a leer o en el que se van a escribir los eventos.

Sobre la propiedad Source debe hacerse una claridad, el registro de sistema toma únicamente los 8 primeros caracteres, por lo que nombres de fuente como “hola Mundo” y “hola Mundial” serán considerados equivalentes y pueden originar conflictos.

Luego de inicializar la aplicación se puede proceder a hacer uso del registro de eventos, usando para esto el método

writeEntry(string message,EventLogEntryType type,int eventID )

Donde:
message es el mensaje que se quiere mostrar
type es el tipo de mensaje (éxito, error, advertencia, mensaje informativo)
y eventID es un número de identificación de mensaje (en caso tal que tengas una codificación numérica de los mensajes)

veamos el uso de esto en el método click de nuestra aplicación:

private void button1_Click(object sender, EventArgs e)
        {
          label1.Text = "hola mundo";
          if (_DEBUG)
              eventLog1.WriteEntry("se ha hecho click", System.Diagnostics.EventLogEntryType.Information, 0);
         

        }

Terminado esto, se procede a compilar el proyecto y para probar que todo esté bien, pueden orientarse por el siguiente video:

Dejar un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: