Compartilhar 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, janela Watch ou Imediato. Os avaliadores de expressão também estão disponíveis na janela Pontos de Parada e em muitos outros locais no depurador.

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

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

Expressões F# não são reconhecidas. Se você estiver depurando o código F#, precisará converter 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 o 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 no C++

Construtores, destrutores e conversões

Você não pode chamar um construtor ou destrutor para um objeto, seja explicitamente 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 )

Você não poderá chamar uma função de conversão se o destino da conversão for 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 função de conversão FixedPoint, a expressão a seguir resultará em um erro:

(FixedPoint)myFraction

Você não pode chamar os operadores new ou delete. Por exemplo, não há suporte para a seguinte expressão:

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 #define's por enums 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:

  • É garantido que é seguro: a execução de uma função intrínseca do depurador não corromperá o processo que está sendo depurado.

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

  • Trabalhe em cenários onde não é possível fazer chamadas de função regulares, como ao 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 como 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 cadeia de caracteres strlen, wcslen, strnlen, wcsnlen
Comparação de cadeia 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
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Essas funções exigem que o processo que está sendo depurado esteja em execução no Windows 8. A depuração de arquivos de despejo de memória gerados por um dispositivo Windows 8 também exige que o computador com o Visual Studio esteja executando o Windows 8. No entanto, se você estiver depurando remotamente um dispositivo com Windows 8, o computador que executa o Visual Studio pode estar rodando o Windows 7.
WindowsGetStringLen e WindowsGetStringRawBuffer são usados apenas pelo EE (mecanismo de execução) no nível de origem.
Miscellaneous __log2 - Retorna a base de log 2 de um inteiro especificado, arredondado para o 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 sem sinal).
- Valores de retorno: (1) índice baseado em 0 do primeiro elemento não nulo na matriz ou -1 se não for encontrado.

Função DecodeHString – Auxiliar para formatar o valor de um HSTRING. Desempilha o valor HSTRING da pilha, empurra os bytes de uma estrutura StringInfo que o EE pode usar para identificar onde a string está localizada. Isso só é usado internamente pelo EE; 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 caracteres de referência restrita.
- Valor de retorno: 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 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 que estamos lançando de e para, 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 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 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 – Operador[] para stdext::hash_map. Pressupõe a função de hash padrão com uma chave de 'int'. Retorna o valor. O operador intrínseco[] dá suporte apenas à recuperação de itens existentes do hashtable – ele não dá suporte à inserção de novos itens na tabela, pois isso pode envolver complexidade indesejada, como alocação de memória. No entanto, o operador[] 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 necessita para realizar a consulta. 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<>)

ConcurrencyArrayView_OperatorBracket_idx // Concorrência::array_view<>::operator[index<>] e operator(index<>)

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

ConcurrencyArrayView_OperatorBracket_tidx // Concorrência::array_view<>::operator[tiled_index<>] e operator(tiled_index<>)

TreeTraverse_Init - Inicializa um novo percurso de árvore.
Dá suporte a visualizadores baseados em extensão, não destinados a serem usados em arquivos .natvis .

TreeTraverse_Next - Obtém nós de um percurso de árvore pendente.
Dá suporte a visualizadores baseados em extensão, não destinados a serem usados em arquivos .natvis .

TreeTraverse_Skip - Ignora nós em uma passagem de árvore pendente.
Dá suporte a 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 conversões que envolvam ponteiros ou conversões definidas pelo usuário.

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

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

  • Não há suporte para boxe e unboxing.

  • Sizeof não há suporte para o operador.

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ó de Exibição Dinâmica é adicionado. O nó Modo de Exibição Dinâmica mostra os membros do objeto, mas não permite a edição dos valores dos membros.

Não há suporte para os seguintes recursos de objetos dinâmicos:

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

  • Muitas conversões, incluindo conversões numéricas e conversões de argumento de tipo

  • Chamadas de método com mais de dois argumentos

  • Métodos de acesso de propriedade com mais de dois argumentos

  • Métodos definidores de propriedades com argumentos

  • Atribuindo a um indexador

  • Operadores boolianos && 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 de depurador que são tipadas estaticamente como dinâmicas. Quando objetos que implementam o IDynamicMetaObjectProvider são avaliados na janela de Observação, um nó de Dynamic View é adicionado. O nó Vista Dinâmica mostra os membros do objeto, mas não permite a edição dos valores dos membros.

Não há suporte para os seguintes recursos de objetos dinâmicos:

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

  • Muitas conversões, incluindo conversões numéricas e conversões de argumento de tipo

  • Chamadas de método com mais de dois argumentos

  • Getters de propriedade com mais de dois argumentos

  • Definidores de propriedade com argumentos

  • Atribuindo a um indexador

  • Operadores boolianos && e ||

Constantes locais

Não há suporte para constantes locais.

Importar Aliases

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

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 . Essas variáveis implícitas têm como escopo 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. Essas variáveis implícitas são do tipo Objeto , 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.