Seguimiento y depuración en Visual C sharp
En este artículo se describe cómo realizar un seguimiento y depurar en Visual C# y se proporcionan algunos pasos de ejemplo para explicar la información relacionada.
Versión original del producto: Visual C#
Número de KB original: 815788
Resumen
Para obtener una versión de .NET de Microsoft Visual Basic de este artículo, vea Usar clases de seguimiento y depuración en Visual Basic .NET.
En este artículo se hace referencia al sistema de espacios de nombres de la biblioteca de clases de .NET Framework. Diagnóstico y describe cómo usar las Debug
clases y Trace
. Estas clases están disponibles en .NET Framework. Puede usar estas clases para proporcionar información sobre el rendimiento de una aplicación durante el desarrollo de aplicaciones o después de la implementación en producción. Estas clases son solo una parte de las características de instrumentación que están disponibles en .NET Framework.
Requisitos
En la lista siguiente se describen el hardware, el software, la infraestructura de red y los Service Pack recomendados que necesita:
- Microsoft Windows
- Microsoft Visual C#
En este artículo también se supone que está familiarizado con la depuración de programas.
Descripción de la técnica
Los pasos de la sección Crear un ejemplo con la clase Debug muestran cómo crear una aplicación de consola que usa la Debug
clase para proporcionar información sobre la ejecución del programa.
Cuando se ejecuta el programa, puede usar métodos de la Debug
clase para generar mensajes que le ayuden a supervisar la secuencia de ejecución del programa, a detectar errores de funcionamiento incorrectos o a proporcionar información de medición del rendimiento. De forma predeterminada, los mensajes que genera la Debug
clase aparecen en la ventana Salida del Entorno de desarrollo integrado (IDE) de Visual Studio.
El código de ejemplo usa el WriteLine
método para generar un mensaje seguido de un terminador de línea. Cuando se usa este método para generar un mensaje, cada mensaje aparece en una línea independiente en la ventana Salida.
Cuando se usa el Assert
método de la Debug
clase , la ventana Salida muestra un mensaje solo si una condición especificada se evalúa como false. El mensaje también aparece en un cuadro de diálogo modal para el usuario. El cuadro de diálogo incluye el mensaje, el nombre del proyecto y .Debug
Número de la instrucción Assert. El cuadro de diálogo también incluye los tres botones de comando siguientes:
Aborta: La aplicación deja de ejecutarse.
Reintentar: La aplicación entra en modo de depuración.
Ignorar: La aplicación continúa. El usuario debe hacer clic en uno de estos botones para que la aplicación pueda continuar.
También puede dirigir la salida de la Debug
clase a destinos distintos de la ventana Salida. La Debug
clase tiene una colección Listeners que incluye Listener
objetos.
Cada objeto Listener supervisa Debug
la salida y dirige la salida a un destino especificado.
Cada agente de escucha de la colección Listener recibe cualquier salida que genere la Debug
clase . Use la TextWriterTraceListener
clase para definir Listener
objetos. Puede especificar el destino de una TextWriterTraceListener
clase a través de su constructor.
Entre los posibles destinos de salida se incluyen los siguientes:
- La ventana Consola mediante la
System.Console.Out
propiedad . - Un archivo de texto (.txt) mediante la
System.IO.File.CreateText("FileName.txt")
instrucción . Después de crear unTextWriterTraceListener
objeto, debe agregar el objeto aDebug
. Recopilación de agentes de escucha para recibirDebug
la salida.
Creación de un ejemplo con la clase Debug
Inicie Visual Studio o Visual C# Express Edition.
Cree un nuevo proyecto de aplicación de consola de Visual C# denominado conInfo. La clase 1 se crea en Visual Studio .NET. Program.cs se crea en Visual Studio 2005.
Agregue el siguiente espacio de nombres en la parte superior de Class1 o Program.cs.
using System.Diagnostics;
Para inicializar variables para que contengan información sobre un producto, agregue las siguientes instrucciones de declaración al método Main:
string sProdName = "Widget"; int iUnitQty = 100; double dUnitCost = 1.03;
Especifique el mensaje que genera la clase como primer parámetro de entrada del
WriteLine
método. Presione la combinación de teclas CTRL+ALT+O para asegurarse de que la ventana Salida está visible.Debug.WriteLine("Debug Information-Product Starting ");
Para mejorar la legibilidad, use el
Indent
método para aplicar sangría a los mensajes posteriores en la ventana Salida:Debug.Indent();
Para mostrar el contenido de las variables seleccionadas, use el método de la
WriteLine
siguiente manera:Debug.WriteLine("The product name is " + sProdName); Debug.WriteLine("The available units on hand are" + iUnitQty.ToString()); Debug.WriteLine("The per unit cost is " + dUnitCost.ToString());
También puede usar el
WriteLine
método para mostrar el espacio de nombres y el nombre de clase de un objeto existente. Por ejemplo, el código siguiente muestra elSystem.Xml.XmlDocument
espacio de nombres en la ventana Salida:System.Xml.XmlDocument oxml = new System.Xml.XmlDocument(); Debug.WriteLine(oxml);
Para organizar la salida, puede incluir una categoría como un segundo parámetro de entrada opcional del
WriteLine
método. Si especifica una categoría, el formato del mensaje de la ventana Salida es "categoría: mensaje". Por ejemplo, la primera línea del código siguiente muestra "Campo: El nombre del producto es Widget" en la ventana Salida:Debug.WriteLine("The product name is " + sProdName,"Field"); Debug.WriteLine("The units on hand are" + iUnitQty,"Field"); Debug.WriteLine("The per unit cost is" + dUnitCost.ToString(),"Field"); Debug.WriteLine("Total Cost is " + (iUnitQty * dUnitCost),"Calc");
La ventana Salida solo puede mostrar mensajes si una condición designada se evalúa como true mediante el
WriteLineIf
método de laDebug
clase . La condición que se va a evaluar es el primer parámetro de entrada delWriteLineIf
método. El segundo parámetro deWriteLineIf
es el mensaje que aparece solo si la condición del primer parámetro se evalúa como true.Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear"); Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
Use el método Assert de la
Debug
clase para que la ventana Salida muestre el mensaje solo si una condición especificada se evalúa como false:Debug.Assert(dUnitCost > 1, "Message will NOT appear"); Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
Cree los
TextWriterTraceListener
objetos para la ventana Consola (tr1) y para un archivo de texto denominado Output.txt (tr2) y, a continuación, agregue cada objeto a la colección Depurar agentes de escucha:TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out); Debug.Listeners.Add(tr1); TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt")); Debug.Listeners.Add(tr2);
Para mejorar la legibilidad, use el
Unindent
método para quitar la sangría de los mensajes posteriores que genera laDebug
clase . Cuando se usan losIndent
métodos yUnindent
juntos, el lector puede distinguir la salida como grupo.Debug.Unindent(); Debug.WriteLine("Debug Information-Product Ending");
Para asegurarse de que cada
Listener
objeto recibe toda su salida, llame al método Flush para losDebug
búferes de clase:Debug.Flush();
Uso de la clase Trace
También puede usar la Trace
clase para generar mensajes que supervisen la ejecución de una aplicación. Las Trace
clases y Debug
comparten la mayoría de los mismos métodos para generar resultados, incluidos los siguientes:
- WriteLine
- WriteLineIf
- Sangría
- Desenlaztar
- Afirmar
- Rubor
Puede usar las Trace
clases y Debug
por separado o juntas en la misma aplicación. En un proyecto de configuración de la solución de depuración, tanto como Trace
Debug
la salida están activas. El proyecto genera la salida de ambas clases a todos los Listener
objetos. Sin embargo, un proyecto de configuración de solución de versión solo genera la salida de una Trace
clase. El proyecto Release Solution Configuration omite cualquier Debug
invocación de método de clase.
Trace.WriteLine("Trace Information-Product Starting ");
Trace.Indent();
Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");
Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");
Trace.Flush();
Console.ReadLine();
Comprobar que funciona
Asegúrese de que Debug es la configuración actual de la solución.
Si la ventana Explorador de soluciones no está visible, presione la combinación de teclas CTRL+ALT+L para mostrar esta ventana.
Haga clic con el botón derecho en conInfoy, a continuación, haga clic en Propiedades.
En el panel izquierdo de la página de propiedades conInfo , en la carpeta Configuración , asegúrese de que la flecha apunta a Depuración.
Nota:
En Visual C# 2005 y en Visual C# 2005 Express Edition, haga clic en Depurar en la página conInfo .
Encima de la carpeta Configuración , en el cuadro de lista desplegable Configuración , haga clic en Activo (Depurar) o Depurary, a continuación, haga clic en Aceptar. En Visual C# 2005 y en Visual C# 2005 Express Edition, haga clic en Activo (Depurar) o Depurar en el cuadro de lista desplegable Configuración de la página Depurar y, a continuación, haga clic en Guardar en el menú Archivo .
Presione CTRL+ALT+O para mostrar la ventana Salida .
Presione la tecla F5 para ejecutar el código. Cuando aparezca el cuadro de diálogo Error de aserción , haga clic en Omitir.
En la ventana Consola , presione ENTRAR. El programa debe finalizar y la ventana Salida debe mostrar la salida similar a la siguiente:
Debug Information-Product Starting The product name is Widget The available units on hand are100 The per unit cost is 1.03 System.Xml.XmlDocument Field: The product name is Widget Field: The units on hand are100 Field: The per unit cost is1.03 Calc: Total Cost is 103 This message WILL appear ---- DEBUG ASSERTION FAILED ---- ---- Assert Short Message ---- Message will appear since dUnitcost < 1 is false ---- Assert Long Message ---- at Class1.Main(String[] args) <%Path%>\class1.cs(34) The product name is Widget The available units on hand are100 The per unit cost is 1.03 Debug Information-Product Ending Trace Information-Product Starting The product name is Widget Field: The product name isWidget This message WILL appear Trace Information-Product Ending
La ventana Consola y el archivo Output.txt deben mostrar la siguiente salida:
The product name is Widget The available units on hand are 100 The per unit cost is 1.03 Debug Information-Product Ending Trace Information-Product Starting The product name is Widget Field: The product name is Widget This message WILL appear Trace Information-Product Ending
Nota:
El archivo Output.txt se encuentra en el mismo directorio que el archivo ejecutable conInfo (conInfo.exe). Normalmente, esta es la carpeta \bin donde se almacena el origen del proyecto. El valor predeterminado es C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\bin
En Visual C# 2005 y en Visual C# 2005 Express Edition, el archivo Output.txt se encuentra en la carpeta : C:\Documents and Settings\User login\My Documents\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug
.
Lista de código completa
using System;
using System.Diagnostics;
class Class1
{
[STAThread]
static void Main(string[] args)
{
string sProdName = "Widget";
int iUnitQty = 100;
double dUnitCost = 1.03;
Debug.WriteLine("Debug Information-Product Starting ");
Debug.Indent();
Debug.WriteLine("The product name is "+sProdName);
Debug.WriteLine("The available units on hand are"+iUnitQty.ToString());
Debug.WriteLine("The per unit cost is "+ dUnitCost.ToString());
System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
Debug.WriteLine(oxml);
Debug.WriteLine("The product name is "+sProdName,"Field");
Debug.WriteLine("The units on hand are"+iUnitQty,"Field");
Debug.WriteLine("The per unit cost is"+dUnitCost.ToString(),"Field");
Debug.WriteLine("Total Cost is "+(iUnitQty * dUnitCost),"Calc");
Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
Debug.Assert(dUnitCost > 1, "Message will NOT appear");
Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(tr1);
TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
Debug.Listeners.Add(tr2);
Debug.WriteLine("The product name is "+sProdName);
Debug.WriteLine("The available units on hand are"+iUnitQty);
Debug.WriteLine("The per unit cost is "+dUnitCost);
Debug.Unindent();
Debug.WriteLine("Debug Information-Product Ending");
Debug.Flush();
Trace.WriteLine("Trace Information-Product Starting ");
Trace.Indent();
Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");
Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");
Trace.Flush();
Console.ReadLine();
}
}
Solucionar problemas
Si el tipo de configuración de la solución es Release, se omite la salida de la
Debug
clase.Después de crear una
TextWriterTraceListener
clase para un destino determinado,TextWriterTraceListener
recibe la salida de lasTrace
clases yDebug
. Esto ocurre independientemente de si se usa elAdd
método de oTrace
laDebug
clase para agregarTextWriterTraceListener
a laListeners
clase .Si agrega un
Listeners
objeto para el mismo destino en lasTrace
clases yDebug
, cada línea de salida se duplica, independientemente de siDebug
genera oTrace
genera la salida.TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out); Debug.Listeners.Add(myWriter); TextWriterTraceListener myCreator = new TextWriterTraceListener(System.Console.Out); Trace.Listeners.Add(myCreator);
Referencias
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de