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 #define
s 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 questr[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
ouModule
.