Informações de log na janela Saída usando pontos de rastreamento no Visual Studio

Os tracepoints permitem registrar informações na janela “Saída” em condições configuráveis sem modificar nem interromper o código. Esse recurso tem suporte para linguagens gerenciadas (C#, Visual Basic, F#) e código nativo, bem como linguagens como JavaScript e Python.

Observação

Para obter informações sobre como registrar em log informações na janela Saída programaticamente utilizando APIs .NET, consulte Enviar mensagens para a janela Saída.

Vejamos um exemplo

O programa de exemplo a seguir é um loop for simples com uma variável de contador que aumenta um cada vez que o loop executa outra iteração.

Screenshot of a sample counter program.

O programa de exemplo a seguir é um loop for simples com uma variável de contador que aumenta um cada vez que o loop executa outra iteração.


using System.Diagnostics;

namespace Tracepoints
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int counter = 0;
            for (int i=0; i<=10; i++)
            {
                counter +=1;
            }
        }
    }
}

Definir pontos de rastreamento no código-fonte

Você pode definir pontos de rastreamento especificando uma cadeia de caracteres de saída na caixa de seleção Ação na janela Configurações do Ponto de Interrupção.

  1. Para inicializar um ponto de rastreamento, primeiro clique na sarjeta à esquerda do número de linha em que você deseja definir o ponto de rastreamento.

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Passe o mouse sobre o círculo vermelho e clique no ícone de engrenagem.

  3. Essa ação abre a janela Configurações do Ponto de Interrupção.

    Screenshot showing Breakpoint Window.

  4. Marque a caixa de seleção Ação.

    Screenshot of breakpoint window with Actions Box checked.

    Observe como o círculo vermelho muda para um diamante indicando que você alternou de um ponto de interrupção para um ponto de rastreamento.

  5. Insira a mensagem que você deseja fazer logon na caixa de texto Mostrar uma mensagem na Janela de Saída (para obter detalhes, consulte seções posteriores neste artigo).

    Agora, seu ponto de rastreamento está definido. Pressione o botão "Fechar" se tudo o que você deseja fazer é registrar algumas informações na Janela de Saída.

  6. Se você quiser adicionar condições que determinem se sua mensagem é exibida, marque a caixa de seleção Condições.

    Screenshot of breakpoint window with Conditions Box checked.

    Você tem três opções para condições: Expressão Condicional, Filtro e Contagem de Ocorrências.

Você pode definir pontos de rastreamento especificando uma cadeia de caracteres de saída na caixa de seleção Ação na janela Configurações do Ponto de Interrupção.

  1. Para inicializar um ponto de rastreamento, primeiro clique na sarjeta à esquerda do número de linha em que você deseja definir o ponto de rastreamento.

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Passe o mouse sobre o círculo vermelho e clique no ícone de engrenagem para abrir a janela Configurações do Ponto de Interrupção.

    Screenshot showing Breakpoint Window.

  3. Marque a caixa de seleção Ação.

    Screenshot of breakpoint window with Actions Box checked.

    Observe como o círculo vermelho muda para um diamante indicando que você alternou de um ponto de interrupção para um ponto de rastreamento.

  4. Insira a mensagem que você deseja fazer logon na caixa de texto Mostrar uma mensagem na Janela de Saída (para obter detalhes, consulte seções posteriores neste artigo).

    Agora, seu ponto de rastreamento está definido. Pressione o botão "Fechar" se tudo o que você deseja fazer é registrar algumas informações na Janela de Saída.

  5. Se você quiser adicionar condições que determinem se sua mensagem é exibida, marque a caixa de seleção Condições.

    Screenshot of breakpoint window with Conditions Box checked.

    Você tem três opções para condições: Expressão Condicional, Filtro e Contagem de Ocorrências.

Menu de ações

Esse menu permite registrar uma mensagem na janela Saída. Digite as cadeias de caracteres que você deseja gerar para a caixa de mensagem (sem aspas necessárias). Se você quiser exibir valores de variáveis, coloque-o entre chaves.

Por exemplo, se você quiser exibir o valor da variável counter no console de saída, digite {counter} na caixa de texto da mensagem.

Screenshot showing Counter Output Message.

Se você clicar em Fechar e depurar o programa (F5), verá a saída a seguir na janela Saída.

Screenshot showing Actions Message In Output Window.

Você também pode usar palavras-chave especiais para exibir informações mais específicas. Insira a palavra-chave exatamente conforme mostrado abaixo (use um "$" na frente de cada palavra-chave e todas as tampas para a própria palavra-chave).

Palavra-chave O que é exibido
$ADDRESS Instrução atual
$CALLER Nome da função de chamada
$CALLSTACK Pilha de chamadas
$FUNCTION Nome da função atual
$PID ID do Processo
$PNAME Nome do processo
$TID ID do thread
$TNAME Nome do thread
$TICK Contagem de tiques (do Windows GetTickCount)

Esse menu permite registrar uma mensagem na janela Saída. Digite as cadeias de caracteres que você deseja gerar para a caixa de mensagem (sem aspas necessárias). Se você quiser exibir valores de variáveis, coloque-o entre chaves.

Por exemplo, se você quiser exibir o valor da variável counter no console de saída, digite {counter} na caixa de texto da mensagem.

Screenshot showing Counter Output Message.

Se você clicar em Fechar e depurar o programa (F5), verá a saída a seguir na janela Saída.

Screenshot showing Actions Message In Output Window.

Você também pode usar palavras-chave especiais para exibir informações mais específicas. Insira a palavra-chave exatamente conforme mostrado abaixo (use um "$" na frente de cada palavra-chave e todas as tampas para a própria palavra-chave).

Palavra-chave O que é exibido
$ADDRESS Instrução atual
$CALLER Nome da função de chamada
$CALLSTACK Pilha de chamadas
$FUNCTION Nome da função atual
$PID ID do Processo
$PNAME Nome do processo
$TID ID do thread
$TNAME Nome do thread
$TICK Contagem de tiques (do Windows GetTickCount)

Menu condições

As condições permitem filtrar suas mensagens de saída, para que elas sejam exibidas somente em determinados cenários. Há três tipos principais de condições disponíveis para você.

Expressões condicionais

Para uma expressão condicional, uma mensagem de saída é exibida somente quando determinadas condições são atendidas.

Para expressões condicionais, você pode definir o ponto de rastreamento para gerar uma mensagem quando uma determinada condição for verdadeira ou quando ela for alterada. Por exemplo, se você quiser exibir apenas o valor do contador durante até mesmo iterações do loop for, poderá selecionar a opção É verdadeiro e digitar i%2 == 0 na caixa de texto da mensagem.

Screenshot showing Conditional Expression Is True.

Se você quiser imprimir o valor do contador quando a iteração do for loop for alterada, selecione a opção Quando alterado e digite i na caixa de texto da mensagem.

Screenshot showing when Conditional Expression is Changed.

O comportamento da opção Quando alterado é diferente para linguagens de programação diferentes.

  • Para código nativo, o depurador não considera a primeira avaliação da condição como uma alteração, portanto, não atinge o tracepoint na primeira avaliação.
  • Para código gerenciado, o depurador atinge o ponto de rastreamento na primeira avaliação depois que Quando alterado é selecionado.

Para obter uma visão mais abrangente das expressões válidas que você pode usar ao definir condições, consulte Expressões no depurador.

Para uma expressão condicional, uma mensagem de saída é exibida somente quando determinadas condições são atendidas.

Para expressões condicionais, você pode definir o ponto de rastreamento para gerar uma mensagem quando uma determinada condição for verdadeira ou quando ela for alterada. Por exemplo, se você quiser exibir apenas o valor do contador durante até mesmo iterações do loop for, poderá selecionar a opção É verdadeiro e digitar i%2 == 0 na caixa de texto da mensagem.

Screenshot showing Conditional Expression Is True.

Se você quiser imprimir o valor do contador quando a iteração do for loop for alterada, selecione a opção Quando alterado e digite i na caixa de texto da mensagem.

Screenshot showing when Conditional Expression is Changed.

O comportamento da opção Quando alterado é diferente para linguagens de programação diferentes.

  • Para código nativo, o depurador não considera a primeira avaliação da condição como uma alteração, portanto, não atinge o tracepoint na primeira avaliação.
  • Para código gerenciado, o depurador atinge o ponto de rastreamento na primeira avaliação depois que Quando alterado é selecionado.

Você também pode definir a condição quando o ponto de rastreamento pode ser habilitado inserindo um Ponto de Interrupção em qualquer seção específica do código e marcando a caixa de seleção Habilitar somente quando o seguinte ponto de interrupção for atingido: opção no menu Configurações do Ponto de Interrupção. Você pode escolher qualquer ponto de interrupção na lista de opções.

Screenshot showing enable when a breakpoint is hit checked.

Para obter uma visão mais abrangente das expressões válidas que você pode usar ao definir condições, consulte Expressões no depurador.

Contagem de acertos

Uma condição de contagem de ocorrências permite que você envie a saída somente depois que a linha de código em que o ponto de rastreamento está definido tiver executado um número especificado de vezes.

Para contagem de ocorrências, você pode optar por gerar uma mensagem quando a linha de código em que o ponto de rastreamento está definido tiver sido executada um determinado número de vezes. Com base no requisito, ele pode ser igual a ou é um múltiplo de ou é maior ou igual ao valor de contagem de ocorrências especificado. Escolha a opção que melhor atenda às suas necessidades e digite um valor inteiro no campo (por exemplo, 5) que representa essa iteração de interesse.

Screenshot showing Conditional Expression Hit Count.

Uma condição de contagem de ocorrências permite que você envie a saída somente depois que a linha de código em que o ponto de rastreamento está definido tiver executado um número especificado de vezes.

Para contagem de ocorrências, você pode optar por gerar uma mensagem quando a linha de código em que o ponto de rastreamento está definido tiver sido executada um determinado número de vezes. Com base no requisito, ele pode ser igual a ou é um múltiplo de ou é maior ou igual ao valor de contagem de ocorrências especificado. Escolha a opção que melhor atenda às suas necessidades e digite um valor inteiro no campo (por exemplo, 5) que representa essa iteração de interesse.

Screenshot showing Conditional Expression Hit Count.

Você também pode remover o ponto de interrupção na primeira ocorrência habilitando a caixa de seleção Remover ponto de interrupção após a ocorrência.

Screenshot showing Remove breakpoint on first hit.

Filtrar

Para uma condição de filtro, especifique para quais dispositivos, processos ou saída de threads são mostrados.

Screenshot showing Conditional Expression Filter.

Lista de expressões de filtro:

  • MachineName = "nome"
  • ProcessId = valor
  • ProcessName = "nome"
  • ThreadId = valor
  • ThreadName = "nome"

Coloque cadeias de caracteres (como nomes) entre aspas duplas. Os valores podem ser inseridos sem aspas. Você pode combinar cláusulas usando & (AND), || (OR), ! (NOT) e parênteses.

Para uma condição de filtro, especifique para quais dispositivos, processos ou saída de threads são mostrados.

Screenshot showing Conditional Expression Filter.

Lista de expressões de filtro:

  • MachineName = "name"
  • ProcessId = value
  • ProcessName = "name"
  • ThreadId = value
  • ThreadName = "name"

Coloque cadeias de caracteres (como nomes) entre aspas duplas. Os valores podem ser inseridos sem aspas. Você pode combinar cláusulas usando & (AND), || (OR), ! (NOT) e parênteses.

Considerações

Embora os tracepoints se destinem a tornar a depuração uma experiência mais limpa e suave. Há algumas considerações que você deve estar ciente quando se trata de usá-las.

Às vezes, quando você inspeciona uma propriedade ou atributo de um objeto, seu valor pode ser alterado. Se o valor for alterado durante a inspeção, não será um bug causado pelo próprio recurso de tracepoint. No entanto, o uso de tracepoints para inspecionar objetos não evita essas modificações acidentais.

A maneira como as expressões são avaliadas na caixa de mensagem Ação pode ser diferente do idioma que você está usando no momento para desenvolvimento. Por exemplo, para gerar uma cadeia de caracteres, você não precisa encapsular uma mensagem entre aspas, mesmo que normalmente use Debug.WriteLine() ou console.log(). Além disso, a sintaxe de chaves ({ }) para expressões de saída também pode ser diferente da convenção para gerar valores em sua linguagem de desenvolvimento. (No entanto, o conteúdo dentro das chaves ({ }) ainda deve ser escrito usando a sintaxe da linguagem de desenvolvimento).

Se você estiver tentando depurar um aplicativo ativo e procurando um recurso semelhante, confira nosso recurso de ponto de log no Depurador de Instantâneos. O depurador de instantâneos é uma ferramenta usada para investigar problemas em aplicativos de produção. Os logpoints também permitem que você envie mensagens para a Janela de Saída sem precisar modificar o código-fonte e não afete o aplicativo em execução. Para obter mais informações, consulte Depurar aplicativo do Azure ativo.