Partilhar via


Expressões no depurador do Visual Studio

O depurador do Visual Studio inclui os avaliadores de expressão que funcionam quando você insere uma expressão na caixa de diálogo QuickWatch, na janela Inspeção ou na janela Imediato. Os avaliadores de expressão também estão no trabalho na janela Pontos de interrupção e em muitos outros locais no depurador.

As seções a seguir descrevem as limitações da avaliação de expressão para linguagens compatíveis com o Visual Studio.

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

As expressões F# não são reconhecidas. Se você estiver depurando em código F#, precisará converter as expressões na sintaxe C# antes de inserir expressões em uma janela do depurador ou em uma caixa de diálogo. Quando você converter expressões de F# em C#, certifique-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, destruidores e conversões

Não é possível chamar um construtor ou destruidor para um objeto, seja explícita ou implicitamente. 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 quando o destino da conversão é uma classe. Essa conversão envolve a construção de um objeto. Por exemplo, se myFraction for uma instância de CFraction, que define o operador da função de conversão FixedPoint, a expressão a seguir resultará em erro:

(FixedPoint)myFraction

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

new Date(2,3,1985)

Macros de pré-processador

Não há suporte para macros de pré-processador 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 #defines por enumerações e funções sempre que possível.

Usando declarações de namespace

Não é possível usar declarações using namespace. 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 inspeçã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 certamente seguras: executar uma função intrínseca do depurador não corromperá o processo que estiver sendo depurado.

  • São permitidas em todas as expressões, mesmo nos cenários em que os efeitos colaterais e a avaliação de função não são permitidos.

  • Funcionam nos cenários em que as chamadas de funções normais não são possíveis, por exemplo, depurar um minidespejo.

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

Área Funções intrínsecas
Comprimento de cadeias de caracteres 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 cadeias de caracteres strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Essas funções exigem que o processo que está sendo depurado seja executado no Windows 8. Depurar os arquivos de despejo gerados a partir de um dispositivo do Windows 8 também exige que o computador do Visual Studio esteja executando o Windows 8. No entanto, se você estiver depurando um dispositivo do Windows 8 remotamente, o computador do Visual Studio poderá executar o Windows 7.
WindowsGetStringLen e WindowsGetStringRawBuffer são usados apenas pelo mecanismo de execução (EE) no nível de origem.
Diversos __log2 – Retorna a base 2 de log de um inteiro especificado, arredondada para o menor inteiro 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 sem sinal).
– Valores retornados: (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. Exibe o valor HSTRING da pilha e envia por push os bytes de uma estrutura StringInfo que o EE pode usar para informar onde a cadeia de caracteres está localizada. Isso só é usado internamente pelo EE; não está disponível para o usuário chamar 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 caracteres de referência restrita.
- Valor retornado: caracteres de uma cadeia de caracteres terminada em nulo que contém a mensagem de erro real a ser mostrada.

DynamicCast – implementa dynamic_cast.
- Parâmetros: (1) Ponteiro para o objeto a ser convertido.
- 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 associado à conversão, bem como se estamos avaliando ou não uma expressão natvis (necessária para que o diagnóstico interrompa a recursão infinita).
- Valor retornado: (1) um ponteiro para o objeto, convertido no 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 de classe dinamicamente

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

Stdext_HashMap_Int_OperatorBracket_idx – Operator[] para stdext::hash_map. Pressupõe a função de hash padrão com uma chave de 'int'. Retorna do valor. O operador intrínseco[] só oferece suporte à recuperação de itens existentes da tabela de hash, não oferecendo suporte à 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 que já está 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 de 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 retornados: (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 maneira que stdext::hash_map, exceto que a função de hash é diferente.

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

ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] e operator(tiled_index<>)

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

ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...)

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

TreeTraverse_Init – inicializa uma nova passagem de árvore.
Oferece suporte a visualizadores baseados em extensão, não destinados ao uso em arquivos .natvis.

TreeTraverse_Next – recupera nós de uma passagem de árvore pendente.
Oferece suporte a visualizadores baseados em extensão, não destinados ao uso em arquivos .natvis.

TreeTraverse_Skip – Ignora nós em uma passagem de árvore pendente.
Oferece suporte a visualizadores baseados em extensão, não destinados ao uso em arquivos .natvis.

C++/CLI – Expressões sem suporte

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

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

  • Não há suporte para operadores sobrecarregados e funções sobrecarregadas.

  • Não há suporte para conversão boxing e unboxing.

  • Não há suporte ao operador Sizeof.

C# – Expressões sem suporte

Objetos dinâmicos

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

Os seguintes recursos de objetos dinâmicos não são compatíveis:

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

  • Várias conversões, inclusive conversões numéricas e conversões de tipo de argumento

  • Chamadas de método com mais de dois argumentos

  • Getters da propriedade com mais de dois argumentos

  • Setters de propriedade com argumentos

  • Atribuição a um indexador

  • Operadores boolianos && e ||

Métodos anônimos

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

Visual Basic – Expressões sem suporte

Objetos dinâmicos

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

Os seguintes recursos de objetos dinâmicos não são compatíveis:

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

  • Várias conversões, inclusive conversões numéricas e conversões de tipo de argumento

  • Chamadas de método com mais de dois argumentos

  • Getters da propriedade com mais de dois argumentos

  • Setters de propriedade com argumentos

  • Atribuição a um indexador

  • Operadores boolianos && e ||

Constantes locais

Não há suporte para constantes locais.

Aliases de importação

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

Declarações de variável

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 Imediata. O escopo dessas variáveis implícitas é a sessão do depurador, não podendo ser acessadas fora do depurador. Por exemplo, a instrução o = 5 criará implicitamente uma nova variável o e atribuirá o valor 5 a ela. Essas variáveis implícitas são do tipo Object a menos que o tipo possa ser inferido pelo depurador.

Palavras-chave sem suporte

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

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