Variáveis de inspeção com janelas Inspeção e QuickWatch

Durante a depuração, você pode usar janelas de Inspeção e QuickWatch para inspecionar variáveis e expressões. As janelas ficam disponíveis apenas durante uma sessão de depuração.

As janelas de Inspeção podem exibir diversas variáveis por vez durante a depuração. A caixa de diálogo QuickWatch exibe uma só variável por vez e precisa ser fechada para que a depuração possa continuar. Para obter mais informações sobre o uso de QuickWatch, consulte Observar uma variável ou expressão com QuickWatch.

Observação

Se esta for sua primeira tentativa de depurar código, leia Depuração para iniciantes absolutos e Técnicas e ferramentas de depuração antes de continuar com este artigo.

Observar variáveis com uma janela Inspeção

Você pode abrir mais de uma janela Inspeção e observar mais de uma variável em uma janela Inspeção.

Por exemplo, para definir uma inspeção nos valores de a, b e c no seguinte código:

int main()
{
    int a, b, c;
    a = 1;
    b = 2;
    c = 0;

    for (int i = 0; i < 10; i++)
    {
        a++;
        b *= 2;
        c = a + b;
    }

    return 0;
}

  1. Defina um ponto de interrupção na linha c = a + b; clicando na margem esquerda e selecionando Depurar>Alternar Ponto de Interrupção ou pressionando F9.

  2. Inicie a depuração selecionando a seta verde Iniciar ou Depurar>Iniciar Depuração ou pressionando F5. A execução pausa no ponto de interrupção.

  3. Abra uma janela Inspeção selecionando Depurar>Janelas>Inspeção>Inspeção 1 ou pressionando Ctrl+Alt+W>1.

    Você pode abrir janelas Inspeção adicionais selecionando as janelas 2, 3 ou 4.

  4. Na janela Inspeção, selecione uma linha vazia e digite a variável a. Faça o mesmo para b e c.

    Screenshot of Watch variables.

    Screenshot of Watch variables.

  5. Continue a depuração selecionando Depurar>Intervir ou pressionando F11 conforme necessário para avançar. Os valores de variável na janela Inspeção mudam à medida que você itera pelo loop for.

Observação

Somente para C++,

  • Talvez seja necessário qualificar o contexto de um nome de variável ou de uma expressão que usa um nome de variável. O contexto é a função, o arquivo de origem ou o módulo em que uma variável fica localizada. Se precisar qualificar o contexto, use a sintaxe de operador de contexto (C++) no Nome na janela Inspeção.

  • Você pode adicionar nomes de registro e de variáveis usando $<nome de registro> ou @<nome de registro> ao Nome na janela Inspeção. Para obter mais informações, consulte Pseudovariáveis.

Usar expressões em uma janela Inspeção

Você pode observar qualquer expressão válida reconhecida pelo depurador em uma janela Inspeção.

Por exemplo, para o código na seção anterior, você pode obter a média dos três valores inserindo (a + b + c) / 3 na janela Inspeção:

Screenshot of Watch expression.

Screenshot of Watch expression.

As regras para avaliar expressões na janela Inspeção geralmente são as mesmas regras usadas para avaliar expressões na linguagem de código. Se uma expressão tiver um erro de sintaxe, espere o mesmo erro do compilador que apareceria no editor de código. Por exemplo, um erro de digitação na expressão anterior produz este erro na janela Inspeção:

Screenshot of Watch expression error.

Screenshot of Watch expression error.

Um círculo com dois ícones de linhas onduladas pode aparecer na janela Inspeção. Esse ícone significa que o depurador não avalia a expressão devido a uma possível dependência entre threads. Avaliar o código requer que outros threads no aplicativo sejam executados temporariamente, mas como você está no modo de interrupção, todos os threads no aplicativo geralmente são interrompidos. Permitir que outros threads sejam executados temporariamente pode ter efeitos inesperados sobre o estado do aplicativo, e o depurador poderá ignorar eventos como pontos de interrupção e exceções nesses threads.

Pesquisar na janela Inspeção

Você pode pesquisar palavras-chave nas colunas Nome, Valor e Tipo da janela Inspeção usando a barra de pesquisa acima de cada janela. Pressione ENTER ou selecione uma das setas para executar uma pesquisa. Para cancelar uma pesquisa em andamento, selecione o ícone "x" na barra de pesquisa.

Use as setas para a esquerda e para a direita (Shift+F3 e F3, respectivamente) para navegar entre as correspondências encontradas.

Screenshot of Search in Watch Window.

Para deixar sua pesquisa mais ou menos completa, use a lista suspensa Pesquisar mais profundamente na parte superior da janela Inspeção para selecionar quantos níveis de profundidade você deseja pesquisar em objetos aninhados.

Fixar propriedades na janela Inspeção

Observação

Esse recurso é compatível com o .NET Core 3.0 ou superior.

Você pode inspecionar rapidamente objetos segundo suas propriedades na janela Inspeção com a ferramenta Propriedades Fixáveis. Para usar essa ferramenta, passe o mouse sobre uma propriedade e selecione o ícone de pino exibido ou clique com o botão direito do mouse e selecione a opção Fixar Membro como Favorito no menu de contexto resultante. Isso expande essa propriedade até a parte superior da lista de propriedades do objeto, e o nome e o valor da propriedade são exibidos na coluna Valor. Para desafixar uma propriedade, selecione o ícone de pino novamente ou selecione a opção Desafixar Membro como Favorito no menu de contexto.

Screenshot of Pin properties in the Watch window.

Você também pode alternar entre os nomes das propriedades e filtrar propriedades não fixadas enquanto exibe a lista de propriedades do objeto na janela Inspeção. Você pode acessar as duas opções selecionando os botões na barra de ferramentas acima da janela de inspeção.

Atualizar valores de inspeção

Um ícone de atualização (seta circular) pode aparecer na janela Inspeção quando uma expressão é avaliada. O ícone de atualização indica um erro ou um valor desatualizado.

Para atualizar o valor, selecione o ícone de atualização ou pressione a barra de espaços. O depurador tenta reavaliar a expressão. No entanto, talvez você não queira ou não possa reavaliar a expressão, dependendo do motivo pelo qual o valor não foi avaliado.

Passe o mouse sobre o ícone de atualização ou veja a coluna Valor para saber o motivo pelo qual a expressão não foi avaliada. Os motivos incluem:

  • Ocorreu um erro quando a expressão estava sendo avaliada, como no exemplo anterior. Um tempo limite pode ocorrer ou uma variável pode estar fora do escopo.

  • A expressão tem uma chamada de função que pode disparar um efeito colateral no aplicativo. Consulte Efeitos colaterais das expressões.

  • A avaliação automática das propriedades e chamadas de função implícitas está desabilitada.

Se o ícone de atualização aparecer porque a avaliação automática das propriedades e chamadas de função implícitas está desabilitada, você poderá habilitá-la selecionando Habilitar avaliação de propriedade e outras chamadas de função implícitas em Ferramentas>Opções>Depuração>Geral.

Para demonstrar o uso do ícone de atualização:

  1. Em Ferramentas>Opções>Depuração>Geral, desmarque a caixa de seleção Habilitar a avaliação da propriedade e outras chamadas de função implícitas.

  2. Insira o código a seguir e, na janela Inspeção, defina uma inspeção na propriedade list.Count.

    static void Main(string[] args)
    {
        List<string> list = new List<string>();
        list.Add("hello");
        list.Add("goodbye");
    }
    
  3. Inicie a depuração. A janela Inspeção mostra algo parecido com a seguinte mensagem:

    Screenshot of Refresh Watch.

    Screenshot of Refresh Watch.

  4. Para atualizar o valor, selecione o ícone de atualização ou pressione a barra de espaços. O depurador reavalia a expressão.

Efeitos colaterais das expressões

Avaliar algumas expressões pode alterar o valor de uma variável ou, de alguma forma, afetar o estado do aplicativo. Por exemplo, avaliar a expressão a seguir altera o valor de var1:

var1 = var2

Esse código pode causar um efeito colateral. Efeitos colaterais podem dificultar a depuração, alterando a maneira como o aplicativo opera.

Uma expressão com efeitos colaterais é avaliada apenas uma vez, quando você a insere pela primeira vez. Depois disso, a expressão aparece esmaecida na janela Inspeção e avaliações adicionais são desabilitadas. A dica de ferramenta ou a coluna Valor explica que a expressão causa um efeito colateral. Você pode forçar a reavaliação selecionando o ícone de atualização que aparece ao lado do valor.

Uma maneira de evitar efeitos colaterais é desativar a avaliação automática da função. Em Ferramentas>Opções>Depuração>Geral, desmarque Habilitar a avaliação da propriedade e outras chamadas de função implícitas.

Somente para C#, quando a avaliação de propriedades ou chamadas de função implícita é desativada, você pode forçar a avaliação adicionando o modificador de formato ac a um Nome de variável na janela Inspeção. Consulte Especificadores de formato em C#.

Usar IDs de objeto na janela Inspeção (C# e Visual Basic)

Às vezes, você pode querer observar o comportamento de um objeto específico. Por exemplo, talvez você queira acompanhar um objeto referenciado por uma variável local após essa variável ter saído do escopo. Em C# e no Visual Basic, você pode criar IDs de Objeto para instâncias específicas de tipos de referência e usá-las na janela Inspeção e em condições de ponto de interrupção. A ID de Objeto é gerada pelos serviços de depuração do CLR (Common Language Runtime) e associado ao objeto.

Observação

IDs de Objeto criam referências fracas que não impedem que o objeto seja coletado como lixo. Elas são válidas somente para a sessão de depuração atual.

No seguinte código, o método MakePerson() cria um Person usando uma variável local:

class Person
{
    public Person(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

public class Program
{
    static List<Person> _people = new List<Person>();
    public static void Main(string[] args)
    {
        MakePerson();
        DoSomething();
    }

    private static void MakePerson()
    {
        var p = new Person("Bob");
        _people.Add(p);
    }

    private static void DoSomething()
    {
        // more processing
         Console.WriteLine("done");
    }
}

Para descobrir o nome do Person no método DoSomething(), você pode adicionar uma referência à ID do Objeto Person na janela Inspeção.

  1. Defina um ponto de interrupção no código após o objeto Person ter sido criado.

  2. Inicie a depuração.

  3. Quando a execução pausar no ponto de interrupção, abra a janela Locais escolhendo Depurar>Janelas>Locais.

  4. Na janela Locais, clique com o botão direito do mouse na variável Person e selecione Criar ID do Objeto.

    Você deverá ver um cifrão ($) mais um número na janela Locais, que é a ID do Objeto.

  5. Adicione a ID do objeto à janela Inspeção clicando com o botão direito do mouse na ID do Objeto e selecionando Adicionar Inspeção.

  6. Defina outro ponto de interrupção no método DoSomething().

  7. Continue a depuração. Quando a execução pausar no método DoSomething(), a janela Inspeção exibirá o objeto Person.

    Observação

    Para ver as propriedades do objeto, como Person.Name, habilite a avaliação da propriedade selecionando Ferramentas>Opções>Depuração>Geral>Habilitar avaliação de propriedade e outras chamadas de função implícitas.

Exibição Dinâmica e a janela Inspeção

Algumas linguagens de script (por exemplo, JavaScript ou Python) usam digitação dinâmica ou duck, e o .NET versão 4.0 e posterior dá suporte a objetos que são difíceis de observar nas janelas de depuração normais.

A janela Inspeção exibe esses objetos como objetos dinâmicos, que são criados com base em tipos que implementam a interface IDynamicMetaObjectProvider. Nós de objeto dinâmicos mostram os membros dinâmicos dos objetos dinâmicos, mas não permitem a edição dos valores de membros.

Para atualizar os valores da Exibição Dinâmica, selecione o ícone de atualização ao lado do nó de objeto dinâmico.

Para exibir apenas a Exibição Dinâmica de um objeto, adicione um especificador de formato dinâmico após o nome do objeto dinâmico na janela Inspeção:

  • Para C#: ObjectName, dynamic
  • Para o Visual Basic: $dynamic, ObjectName

Observação

  • Para C#, o depurador não reavalia automaticamente os valores na Exibição Dinâmica quando você passa para a próxima linha de código.
  • O depurador do Visual Basic atualiza automaticamente expressões adicionadas por meio da Exibição Dinâmica.
  • A avaliação dos membros de um Modo de Exibição Dinâmico pode ter efeitos colaterais.

Para inserir uma nova variável de inspeção que converte um objeto em um objeto dinâmico:

  1. Clique com o botão direito do mouse em qualquer filho de uma Exibição Dinâmica.
  2. Escolha Adicionar Inspeção. O object.name se torna ((dynamic) object).name e aparece em uma nova janela Inspeção.

O depurador também adiciona um nó filho da Exibição Dinâmica do objeto à janela Autos. Para abrir a janela Autos, durante a depuração, selecione Depurar>Windows>Automáticos.

Exibição Dinâmica também aprimora a depuração para objetos COM. Quando o depurador chega a um objeto COM encapsulado em System.__ComObject, ele adiciona um nó de Exibição Dinâmica ao objeto.

Observar uma só variável ou expressão com QuickWatch

Você pode usar QuickWatch para observar uma só variável.

Por exemplo, para o seguinte código:

static void Main(string[] args)
{
    int a, b;
    a = 1;
    b = 2;
    for (int i = 0; i < 10; i++)
    {
        a = a + b;
    }
}

Para observar a variável a,

  1. Defina um ponto de interrupção na linha a = a + b;.

  2. Inicie a depuração. A execução pausa no ponto de interrupção.

  3. Selecione a variável a no código.

  4. Selecione Depurar>QuickWatch, pressione Shift+F9 ou clique com o botão direito do mouse e selecione QuickWatch.

    A caixa de diálogo QuickWatch é exibida. A variável a está na caixa Expressão com um Valor de 1.

    Screenshot of QuickWatch variable.

    Screenshot of QuickWatch variable.

  5. Para avaliar uma expressão usando a variável, digite uma expressão como a + b na caixa Expressão e selecione Reavaliar.

    Screenshot of QuickWatch expression.

    Screenshot of QuickWatch expression.

  6. Para adicionar a variável ou expressão de QuickWatch à janela Inspeção, selecione Adicionar Inspeção.

  7. Selecione Fechar para fechar a janela QuickWatch. (QuickWatch é uma caixa de diálogo modal, portanto, você não pode continuar a depuração enquanto ela estiver aberta.)

  8. Continue a depuração. Você pode observar a variável na janela Inspeção.