Este artigo descreve como utilizar as classes de
rastreio e
depuração . Estas classes estão disponíveis no Microsoft .NET Framework. Pode utilizar estas classes para fornecer informações sobre o desempenho de uma aplicação durante o desenvolvimento de aplicações ou após a implementação para produção. Estas classes são apenas uma parte as funcionalidades de instrumentação que estão disponíveis no .NET Framework.
Requisitos
A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs que necessita:
- Microsoft Windows 2000 ou Microsoft Windows XP ou Microsoft Windows Server 2003
- Microsoft Visual C#
Este artigo também pressupõe que está familiarizado com o programa de depuração.
Descrição da técnica
Os passos na secção
Create a
Sample with the Debug Class demonstram como criar uma aplicação de consola que utiliza a classe
de depuração para fornecer informações sobre a execução do programa.
Quando o programa é executado, pode utilizar métodos de classe
de depuração para produzir as mensagens que ajudam a monitorizar a sequência de execução do programa, para detectar avarias ou para fornecer informações de medição do desempenho. Por predefinição, as mensagens que produz a classe
de depuração são apresentados na janela Output do Visual Studio IDE (Integrated Development Environment).
O código de exemplo utiliza o método
WriteLine para produzir uma mensagem que é seguida por um terminador de linha. Quando utiliza este método para produzir uma mensagem, cada mensagem aparece numa linha separada na janela de resultados.
Quando utiliza o método de
declaração da classe
de depuração , a janela Output apresenta uma mensagem apenas se uma condição especificada for avaliada como FALSO. A mensagem também aparece numa caixa de diálogo modal ao utilizador. A caixa de diálogo inclui a mensagem, o nome do projecto e o número do extracto
Debug.Assert . A caixa de diálogo também inclui os seguintes três comandos botões:
- abortar: A aplicação pára.
- Repetir: A aplicação entra em modo de depuração.
- Ignorar: A aplicação funciona.
O utilizador tem de clicar destes botões antes de pode continuar a aplicação.
Também pode direccionar a saída da classe
de depuração para destinos seja a janela de resultados. A classe
Debug tem uma colecção denominada
listeners inclui objectos de
serviço de escuta .
Cada objecto de
serviço de escuta monitoriza a saída
de depuração e direcciona a saída para um destino especificado.
Cada
serviço de escuta na colecção de
serviço de escuta recebe todas as saídas que gera a classe
de depuração . Utilize a classe
TextWriterTraceListener para definir objectos
serviço de escuta . Pode especificar o destino de uma classe
TextWriterTraceListener através do respectivo construtor.
Alguns destinos de saída possíveis incluem:
- A janela de consola utilizando a propriedade System.Console.Out .
- Um ficheiro de texto (.txt) utilizando a instrução System.IO.File.CreateText("FileName.txt") .
Depois de criar um objecto
TextWriterTraceListener , terá de adicionar o objecto para a colecção
Debug.Listeners para receber resultados de depuração.
Criar um exemplo com a classe de depuração
- Inicie o Visual Studio ou o Visual C# Express Edition.
- Crie um projecto aplicação do Visual C# consola de novo com o nome conInfo . Aula1 é criada no Visual Studio. NET. Program.cs é criada no Visual Studio 2005.
- Adicione o espaço de nomes seguinte no início Aula1 ou Program.cs.
using System.Diagnostics;
- Para inicializar variáveis contêm informações sobre um produto, adicione as seguintes instruções de declaração método Main :
string sProdName = "Widget";
int iUnitQty = 100;
double dUnitCost = 1.03;
- Especifique a mensagem que produz a classe como o primeiro parâmetro de entrada do método WriteLine . Prima a combinação de teclas CTRL + ALT + O para se certificar que a janela de saída está visível.
Debug.WriteLine("Debug Information-Product Starting "); - Para facilitar a leitura, utilize o método avanço para avançar mensagens subsequentes na janela de resultados:
- Para apresentar o conteúdo das variáveis seleccionados, utilize o método WriteLine da seguinte forma:
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()); - Também pode utilizar o método WriteLine para apresentar o espaço de nomes e o nome da classe para um objecto existente. Por exemplo, o código seguinte apresenta o espaço de nomes System.XML.XmlDocument na janela de saída:
System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
Debug.WriteLine(oxml);
- Para organizar os resultados, pode incluir um parâmetro de categoria como opcional, a segunda entrada do método WriteLine . Se especificar uma categoria, o formato a saída de janela de mensagem é "categoria: mensagem." Por exemplo, a primeira linha de código seguinte mostra "campo: O nome do produto é widget" in a saída de janela:
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"); - A janela de resultados pode apresentar mensagens apenas se uma determinada condição for avaliada como VERDADEIRO utilizando o método WriteLineIf da classe de depuração . A condição a ser avaliada é o primeiro parâmetro de entrada do método WriteLineIf . O segundo parâmetro do WriteLineIf é a mensagem que aparece apenas se a condição do primeiro parâmetro for avaliada como VERDADEIRO.
Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
- Utilizar o método de declaração da classe de depuração para que a janela Output apresenta a mensagem apenas se uma condição especificada for avaliada como falso:
Debug.Assert(dUnitCost > 1, "Message will NOT appear");
Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
- Criar os objectos TextWriterTraceListener para a janela de consola (tr1) e para um ficheiro de texto denominado Output.txt (tr2) e adicione cada objecto à colecção de Depuração Listeners :
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 facilitar a leitura, utilize o método Unindent para remover o avanço para mensagens subsequentes que gera a classe de depuração . Quando utiliza o avanço e os métodos Unindent em conjunto, o leitor consegue distinguir o resultado como grupo.
Debug.Unindent();
Debug.WriteLine("Debug Information-Product Ending"); - Para se certificar de que cada objecto de serviço de escuta recebe todas as respectivas saídas, chamar o método Flush para depuração memórias intermédias de classe:
Utilizar a classe de rastreio
Também pode utilizar a classe de
rastreio para produzir as mensagens que monitorizam a execução de uma aplicação. As classes de
rastreio e
depuração partilham a maior parte dos mesmos métodos para produzir a saída, incluindo os seguintes:
- WriteLine
- WriteLineIf
- Avançar
- unindent
- de asserção
- Limpar
Pode utilizar o
rastreio e as classes
de depuração em separado ou em conjunto na mesma aplicação. Num projecto de configuração de solução de depuração, o
rastreio e saída
de depuração estão activas. O projecto gera resultados partir destas classes para todos os objectos
serviço de escuta . No entanto, um projecto de configuração da solução versão gera apenas saída a partir de uma classe de
rastreio . O projecto de configuração da solução Release ignora qualquer invocações de método de classe
de depuração .
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();
Verificar se funciona
- Certifique-se que a depuração é a actual configuração da solução.
- Se a janela Solution Explorer não estiver visível, prima a combinação de teclas CTRL + ALT + L para apresentar esta janela.
- Clique com o botão direito do rato conInfo e, em seguida, clique em Propriedades .
- No painel esquerdo da página de propriedade conInfo, na pasta de configuração , certifique-se que a seta aponta para a depuração .
Nota No Visual C# 2005 e no Visual C# 2005 Express Edition, clique em depuração na página conInfo . - Acima da pasta de configuração , na configuração de caixa de listagem pendente clique Active Directory (depuração) ou de depuração e, em seguida, clique em OK . No Visual C# 2005 e no Visual C# 2005 Express Edition, clique em Active Directory (depuração) ou de depuração na caixa de lista pendente de configuração na página de depuração e, em seguida, clique em Guardar no menu ficheiro .
- Prima CTRL + ALT + O para apresentar a janela de saída.
- Prima a tecla F5 para executar o código. Quando aparece a caixa de diálogo Falha de asserção , clique em Ignorar .
- Na janela da consola, prima ENTER. Deve terminar o programa e, a janela de saída deve apresentar o resultado se assemelhe ao seguinte
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
- A janela de consola e o ficheiro Output.txt devem apresentar o seguinte resultado:
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 O ficheiro Output.txt está localizado no mesmo directório como conInfo executável (conInfo.exe). Normalmente, esta é a pasta de \bin onde está armazenada a origem do projecto. Por predefinição, esta é C:\Documents and Settings\
User
login \My Documents\Visual Projects\conInfo\bin Studio. No Visual C# 2005 e no Visual C# 2005 Express Edition, o ficheiro Output.txt está localizado na seguinte pasta:
C:\Documents and Settings\ User login \My Documents\Visual 2005\Projects\conInfo\conInfo\bin\Debug Studio
Concluir código lista
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();
}
}Resolução de problemas
- Se o tipo de solução de configuração for Release , o resultado de classe de depuração será ignorado.
- Depois de criar uma classe TextWriterTraceListener para um determinado destino, TextWriterTraceListener recebe resultados de rastreio e as classes de depuração . Isto ocorre independentemente de utilizar o método Add de rastreio ou a classe de depuração para adicionar a classe Listeners TextWriterTraceListener .
- Se adicionar um objecto listeners para o mesmo destino no rastreio e as classes de depuração , cada linha de saída é duplicada, independentemente de se depuração ou Analisar gera o resultado.
TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(myWriter);
TextWriterTraceListener myCreator = new TextWriterTraceListener(System.Console.Out);
Trace.Listeners.Add(myCreator);