Partilhar via


Expressões no depurador do Visual Studio

O depurador do Visual Studio inclui avaliadores de expressão que funcionam quando você insere uma expressão na caixa de diálogo QuickWatch , na janela Watch ou na janela Immediate . Os avaliadores de expressão também funcionam na janela Pontos de paragem e em muitos outros locais no depurador.

As seções a seguir descrevem as limitações da avaliação de expressão para linguagens suportadas pelo Visual Studio.

Não há suporte para expressões F#

As expressões F# não são reconhecidas. Se você estiver depurando código F#, precisará traduzir suas expressões em sintaxe C# antes de inserir as expressões em uma janela ou caixa de diálogo do depurador. Ao traduzir expressões de F# para C#, lembre-se de que C# usa o operador para testar a == igualdade, enquanto F# usa o único =.

Expressões C++

Para obter informações sobre como usar operadores de contexto com expressões em C++, consulte Operador de contexto (C++).

Expressões sem suporte em C++

Construtores, destrutores e conversões

Você não pode chamar um construtor ou um destrutor para um objeto, seja de forma explícita ou implícita. Por exemplo, a expressão a seguir chama explicitamente um construtor e resulta em uma mensagem de erro:

my_date( 2, 3, 1985 )

Não é possível chamar uma função de conversão se o destino da conversão for uma classe. Tal conversão envolve a construção de um objeto. Por exemplo, se myFraction for uma instância de CFraction, que define o operador de função de conversão FixedPoint, a expressão a seguir resulta em um erro:

(FixedPoint)myFraction

Não é possível chamar os operadores new ou delete. Por exemplo, a seguinte expressão não é suportada:

new Date(2,3,1985)

Macros do pré-processador

As macros do pré-processador não são suportadas no depurador. Por exemplo, se uma constante VALUE for declarada como: #define VALUE 3, você não poderá usar VALUE na janela Inspeção . Para evitar essa limitação, você deve substituir #define's por enums e funções sempre que possível.

Usando declarações de namespace

Não é possível usar using namespace declarações. Para acessar um nome de tipo ou variável fora do namespace atual, você deve usar o nome totalmente qualificado.

Namespaces anônimos

Não há suporte para namespaces anônimos. Se você tiver o seguinte código, não poderá adicionar test à janela de observação:

namespace mars
{
    namespace
    {
        int test = 0;
    }
}
int main()
{
    // Adding a watch on test doesn't work.
    mars::test++;
    return 0;
}

Usando funções intrínsecas do depurador para manter o estado

As funções intrínsecas do depurador oferecem uma maneira de chamar determinadas funções C/C++ em expressões sem alterar o estado do aplicativo.

Funções intrínsecas do depurador:

  • São garantidos para serem seguros: executar uma função intrínseca do depurador não corromperá o processo que está a ser depurado.

  • São permitidas em todas as expressões, mesmo em cenários onde efeitos secundários e avaliação de funções não são permitidos.

  • Trabalhe em cenários onde as chamadas de função regulares não são possíveis, como depurar um minidump.

    As funções intrínsecas do depurador também podem tornar a avaliação de expressões mais conveniente. Por exemplo, strcmp(str, "asd") é muito mais fácil escrever em uma condição de ponto de interrupção do que str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Area Funções intrínsecas
Comprimento da string strlen, wcslen, strnlen, wcsnlen
Comparação de cadeias de caracteres strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
Pesquisa de cadeia de caracteres strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Janelas 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Essas funções exigem que o processo que está sendo depurado seja executado no Windows 8. A depuração de arquivos de despejo gerados a partir de um dispositivo Windows 8 também requer que o computador Visual Studio esteja executando o Windows 8. No entanto, se estiveres a depurar um dispositivo Windows 8 remotamente, o computador com o Visual Studio pode estar a executar o Windows 7.
WindowsGetStringLen e WindowsGetStringRawBuffer são usados apenas pelo mecanismo de execução (EE) no nível de origem.
Miscellaneous __log2 - Devolve a base de registo 2 de um número inteiro especificado, arredondada para o número inteiro inferior mais próximo.

__findNonNull - Pesquisa uma matriz de ponteiros, retornando o índice do primeiro elemento não nulo.
- Parâmetros: (1) Ponteiro para o primeiro elemento na matriz (void*), (2) Tamanho da matriz (int não assinado).
- Valores de retorno: (1) índice baseado em 0 do primeiro elemento não nulo na matriz ou -1 se não for encontrado.

DecodeHString - Função auxiliar para formatar o valor de um HSTRING. Remove o valor HSTRING da pilha, adiciona os bytes de uma estrutura "StringInfo" que o ambiente de execução (EE) pode usar para indicar onde a cadeia de caracteres está localizada. Este só é utilizado internamente pela EE; ele não está disponível para o usuário ligar diretamente.

DecodeWinRTRestrictedException - Decodifica uma exceção restrita do WinRT para obter a descrição restrita.
- Parâmetros: (1) caracteres de uma cadeia de caracteres terminada em nulo que representa a cadeia de referência restrita.
- Valor de retorno: Caracteres de uma cadeia de caracteres terminada em nulo contendo a mensagem de erro real a ser mostrada.

DynamicCast - Implementa dynamic_cast.
- Parâmetros: (1) Ponteiro para objeto a converter.
- Itens de dados: Um objeto CDynamicCastData deve ser associado como um item de dados à instrução ExecuteIntrinsic() correspondente. O item de dados codifica o tipo de e para o qual estamos transmitindo, bem como se estamos ou não avaliando uma expressão natvis (necessária para que o diagnóstico quebre a recursão infinita).
- Valor de retorno: (1) Um ponteiro para o objeto, convertido para o tipo correto, ou NULL se o objeto que está sendo convertido não for uma instância do tipo correto.

DynamicMemberLookup - Função auxiliar para obter o valor de um membro da classe dinamicamente

GetEnvBlockLength - Função auxiliar para obter o comprimento de um bloco de ambiente, em caracteres. Usado para $env.

Stdext_HashMap_Int_OperatorBracket_idx - Operador[] para stdext::hash_map. Assume a função hash padrão com uma chave de 'int'. Devolve o valor. O operador intrínseco[] suporta apenas a recuperação de itens existentes da hashtable - não suporta a inserção de novos itens na tabela, pois isso pode envolver complexidade indesejada, como alocação de memória. No entanto, operator[] pode ser usado para modificar o valor associado a uma chave já na tabela.
- Parâmetros de pilha: (1) O endereço do objeto stdext::hash_map, (2) A chave na tabela (int), (3) uma estrutura HashMapPdb que especifica os deslocamentos de campo dos membros que a implementação da função precisa para fazer a pesquisa. Isso é necessário porque o acesso direto aos símbolos não está disponível no lado remoto.
- Valores de retorno: (1) Se a chave estiver na tabela, o endereço do valor que corresponde à chave. Caso contrário, NULL.

Std_UnorderedMap_Int_OperatorBracket_idx - std::unordered_map funciona da mesma forma que stdext::hash_map, exceto que a função hash é diferente.

ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] e operator(index<>)

ConcurrencyArray_OperatorBracket_int // Concorrência::array<>::operator(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concorrência::array<>::operador[tiled_index<>] e operador(tiled_index<>)

ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] e operator(index<>)

ConcurrencyArrayView_OperatorBracket_int // Concorrência::array_view<>::operador(int, int, ...)

ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operador[tiled_index<>] e operador(tiled_index<>)

TreeTraverse_Init - Inicializa uma nova travessia de árvore.
Suporta visualizadores baseados em extensão, não destinados a serem usados em arquivos .natvis .

TreeTraverse_Next - Recupera nós de uma travessia de árvore pendente.
Suporta visualizadores baseados em extensão, não destinados a serem usados em arquivos .natvis .

TreeTraverse_Skip - Ignora nós em uma travessia de árvore pendente.
Suporta visualizadores baseados em extensão, não destinados a serem usados em arquivos .natvis .

C++/CLI - Expressões sem suporte

  • Não há suporte para transmissões que envolvem ponteiros ou transmissões definidas pelo usuário.

  • Não há suporte para comparação e atribuição de objetos.

  • Operadores sobrecarregados e funções sobrecarregadas não são suportados.

  • Boxe e unboxing não são suportados.

  • Sizeof o operador não é suportado.

C# - Expressões sem suporte

Objetos dinâmicos

Você pode usar variáveis em expressões do depurador que são digitadas estaticamente como dinâmicas. Quando objetos que implementam IDynamicMetaObjectProvider são avaliados na janela de Inspeção, um nó Modo de Exibição Dinâmico é adicionado. O nó "Dynamic View" mostra os membros do objeto, mas não permite a edição dos valores desses membros.

Os seguintes recursos de objetos dinâmicos não são suportados:

  • Os operadores compostos +=, -=, %=, /= e *=

  • Muitos casts, incluindo casts numéricos e casts de argumentos de tipo

  • Chamadas de método com mais de dois argumentos

  • Proprietários com mais de dois argumentos

  • Os definidores de propriedade com argumentos

  • Atribuir a um indexador

  • Os operadores booleanos && e ||

Métodos Anônimos

Não há suporte para a criação de novos métodos anônimos.

Visual Basic - Expressões sem suporte

Objetos dinâmicos

Você pode usar variáveis em expressões do depurador que são digitadas estaticamente como dinâmicas. Quando os objetos que implementam o IDynamicMetaObjectProvider são avaliados na janela Observação, um nó de Visualização Dinâmica é adicionado. O nó Vista Dinâmica mostra os membros do objeto, mas não permite editar os valores dos membros.

Os seguintes recursos de objetos dinâmicos não são suportados:

  • Os operadores compostos +=, -=, %=, /= e *=

  • Muitos casts, incluindo casts numéricos e casts de argumentos de tipo

  • Chamadas de método com mais de dois argumentos

  • Proprietários com mais de dois argumentos

  • Definidores de propriedade com argumentos

  • Atribuir a um indexador

  • Operadores && booleanos e ||

Constantes locais

Não há suporte para constantes locais.

Importar pseudónimos

Não há suporte para aliases de importação.

Declarações de variáveis

Não é possível declarar novas variáveis explícitas nas janelas do depurador. No entanto, você pode atribuir novas variáveis implícitas dentro da janela Immediate . Essas variáveis implícitas têm escopo para a sessão de depuração e não são acessíveis fora do depurador. Por exemplo, a instrução o = 5 cria implicitamente uma nova variável o e atribui o valor 5 a ela. Tais variáveis implícitas são do tipo Object , a menos que o tipo possa ser inferido pelo depurador.

Palavras-chave não suportadas

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • Palavras-chave de nível de namespace ou módulo, como End Sub ou Module.