Expresiones en el depurador de Visual Studio

El depurador de Visual Studio incluye evaluadores de expresión que funcionan cuando escribe una expresión en el cuadro de diálogo Inspección rápida , la ventana Inspección o la ventana Inmediato . Los evaluadores de expresión también se utilizan en la ventana Puntos de interrupción y en muchos otros lugares en el depurador.

En las secciones siguientes se describen las limitaciones de la evaluación de expresiones para los lenguajes compatibles con Visual Studio.

No se admiten las expresiones de F#

No se reconocen las expresiones de F#. Si va a depurar código F#, es necesario traducir las expresiones a la sintaxis de C# antes de escribirlas en una ventana o un cuadro de diálogo de depurador. Al traducir expresiones de F# a C#, recuerde que C# usa el operador == para comprobar la igualdad, mientras que F# usa =.

Expresiones de C++

Para obtener información sobre el uso de operadores de contexto con las expresiones de C++, vea Context Operator (C++).

Expresiones no admitidas en C++

Constructores, destructores y conversiones

No puede llamar a un constructor o destructor de un objeto, ya sea de manera explícita como implícita. Por ejemplo, la siguiente expresión llama explícitamente a un constructor y se produce un mensaje de error:

my_date( 2, 3, 1985 )

No puede llamar a una función de conversión si el destino de la conversión es una clase. Dicha conversión implica la construcción de un objeto. Por ejemplo, si myFraction es una instancia de CFraction, que define el operador de la función de conversión FixedPoint, la siguiente expresión genera un error:

(FixedPoint)myFraction

No puede llamar a nuevos operadores ni eliminarlos. Por ejemplo, no se admiten expresiones como la siguiente:

new Date(2,3,1985)

Macros de preprocesador

El depurador no admite las macros de preprocesador. Por ejemplo, si una constante VALUE se declara como: #define VALUE 3, no puede usar VALUE en la ventana Inspección . Para evitar esta limitación, debe reemplazar #definecon enumeraciones y funciones siempre que sea posible.

uso de declaraciones de espacios de nombres

No pueden usar las declaraciones using namespace . Para obtener acceso a un nombre de tipo o variable fuera del espacio de nombres actual, debe usar el nombre completo.

Espacios de nombres anónimos

No se admiten los espacios de nombres anónimos. Si tiene el siguiente código, no puede agregar test a la ventana Inspección:

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

Usar funciones intrínsecas del depurador para mantener el estado

Las funciones intrínsecas del depurador proporcionan una manera de llamar a determinadas funciones de C/C++ en expresiones sin cambiar el estado de la aplicación.

Funciones intrínsecas del depurador:

  • Se garantiza que son seguras: ejecutar una función intrínseca del depurador no dañará el proceso que se está depurando.

  • Se permiten en todas las expresiones, incluso en escenarios en los que no se permiten efectos secundarios ni evaluación de funciones.

  • Funcionan en escenarios en los que no son posibles llamadas de función estándar, por ejemplo la depuración de un minivolcado.

    Las funciones intrínsecas del depurador también pueden crear expresiones de evaluación más adecuadas. Por ejemplo, strncmp(str, "asd") es mucho más fácil de escribir en una condición de punto de interrupción que str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Área Funciones intrínsecas
Longitud de la cadena strlen, wcslen, strnlen, wcsnlen
Comparación de cadena strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
Búsqueda de cadena strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Estas funciones requieren el proceso que se depura para ejecutarse en Windows 8. La depuración de archivos de volcado de memoria generados por un dispositivo con Windows 8 también requiere que el equipo de Visual Studio ejecute Windows 8. Sin embargo, si depura un dispositivo con Windows 8 de forma remota, el equipo de Visual Studio puede ejecutar Windows 7.
WindowsGetStringLen y WindowsGetStringRawBuffer solo se usan por el motor de ejecución (EE) en el nivel de origen.
Varios __log2: devuelve el logaritmo en base 2 de un entero especificado, redondeado al entero más bajo más próximo.

__findNonNull: busca una matriz de punteros y devuelve el índice del primer elemento que no es NULL.
- Parámetros: (1) Puntero al primer elemento de la matriz (void*), (2) Tamaño de la matriz (unsigned int).
- Valores devueltos: (1) índice basado en 0 del primer elemento no null de la matriz o -1 si no se encuentra.

DecodeHString: función auxiliar para dar formato al valor de HSTRING. Saca el valor de HSTRING de la pila, inserta los bytes de una estructura StringInfo que el EE puede usar para saber dónde se encuentra la cadena. Solo se usa internamente por EE; no está disponible para que el usuario lo llame directamente.

DecodeWinRTRestrictedException: descodifica una excepción restringida de WinRT para obtener la descripción restringida.
- Parámetros: (1) caracteres de una cadena terminada en NULL que representa la cadena de referencia restringida.
- Valor devuelto: caracteres de una cadena terminada en NULL que contiene el mensaje de error real que se mostrará.

DynamicCast: implementa dynamic_cast.
- Parámetros: (1) puntero al objeto que se va a convertir.
- Elementos de datos: un objeto CDynamicCastData debe asociarse como un elemento de datos a la instrucción ExecuteIntrinsic() correspondiente. El elemento de datos codifica el tipo desde el que se va a convertir y al que se va a convertir, así como si estamos evaluando o no una expresión natvis (necesaria para que los diagnósticos interrumpan la recursión infinita).
- Valor devuelto: (1) un puntero al objeto, convertido al tipo correcto o NULL si el objeto que se convierte no es una instancia del tipo correcto.

DynamicMemberLookup: función auxiliar para obtener el valor de un miembro de clase dinámicamente

GetEnvBlockLength: función auxiliar para obtener la longitud de un bloque de entorno, en caracteres. Se usa para $env.

Stdext_HashMap_Int_OperatorBracket_idx: Operator[] para stdext::hash_map. Asume la función hash predeterminada con una clave de "int". Devuelve el valor. El elemento operator[] intrínseco solo admite la recuperación de elementos existentes de la tabla hash; no admite la inserción de nuevos elementos en la tabla, ya que esto podría implicar complejidad no deseada, como la asignación de memoria. Sin embargo, se puede usar operator[] para modificar el valor asociado a una clave que ya está en la tabla.
- Parámetros de pila: (1) la dirección del objeto stdext::hash_map, (2) la clave de la tabla (entero), (3) una estructura HashMapPdb que especifica los desplazamientos de campo de los miembros que la implementación de la función necesita para realizar la búsqueda. Esto es necesario porque el acceso directo a los símbolos no está disponible en el lado remoto.
- Valores devueltos: (1) si la clave está en la tabla, la dirección del valor que corresponde a la clave. En caso contrario, NULL.

Std_UnorderedMap_Int_OperatorBracket_idx: std::unordered_map funciona de la misma manera que stdext::hash_map, salvo que la función hash es diferente.

ConcurrencyArray_OperatorBracket_idx // Concurrency::matriz<>::operador[índice<>] y operador(índice<>)

ConcurrencyArray_OperatorBracket_int // Concurrency::matriz<>::operador(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concurrency::matriz<>::operador[índice_en_mosaico<>] y operador(índice_en_mosaico<>)

ConcurrencyArrayView_OperatorBracket_idx // Concurrency::matriz<>::operador[índice<>] y operador(índice<>)

ConcurrencyArrayView_OperatorBracket_int // Concurrency::vista_matriz<>::operador(int, int, ...)

ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::vista_matriz<>::operador[índice_en_mosaico<>] y operador(índice_en_mosaico<>)

TreeTraverse_Init: inicializa un nuevo recorrido de árbol.
Admite visualizadores basados en extensiones, no diseñados para usarse en archivos .natvis.

TreeTraverse_Next: recupera nodos de un recorrido de árbol pendiente.
Admite visualizadores basados en extensiones, no diseñados para usarse en archivos .natvis.

TreeTraverse_Skip: omite los nodos de un recorrido de árbol pendiente.
Admite visualizadores basados en extensiones, no diseñados para usarse en archivos .natvis.

C++/CLI: Expresiones no admitidas

  • No se admiten las conversiones que afectan a punteros o las conversiones definidas por el usuario.

  • No se admiten las comparaciones y asignaciones de objetos

  • No se admiten los operadores y las funciones sobrecargadas.

  • No se admiten las conversiones boxing y unboxing.

  • No se admite el operadorSizeof .

C#: Expresiones no admitidas

Objetos dinámicos

Puede usar variables en expresiones del depurador que tengan tipos estáticos como dinámicos. Cuando los objetos que implementan IDynamicMetaObjectProvider se evalúan en la ventana Inspección, se agrega un nodo Vista dinámica. El nodo Vista dinámica muestra los miembros de objetos, pero no permite editar los valores de los miembros.

No se admiten las características siguientes de los objetos dinámicos:

  • Los operadores compuestos +=, -=, %=, /=y *=

  • Muchas conversiones, incluidas las conversiones numéricas y las conversiones de argumentos de tipos

  • Llamadas a métodos con más de dos argumentos

  • Captadores de propiedades con más de dos argumentos

  • Establecedores de propiedades con argumentos

  • Asignación a un indizador

  • Operadores booleanos && y ||

Métodos anónimos

No se admite la creación de nuevos métodos anónimos.

Visual Basic: Expresiones no admitidas

Objetos dinámicos

Puede usar variables en expresiones del depurador que tengan tipos estáticos como dinámicos. Cuando los objetos que implementan la interfaz IDynamicMetaObjectProvider se evalúan en la ventana Inspección, se agrega el nodo Vista dinámica. El nodo Vista dinámica muestra los miembros de objetos, pero no permite editar los valores de los miembros.

No se admiten las características siguientes de los objetos dinámicos:

  • Los operadores compuestos +=, -=, %=, /=y *=

  • Muchas conversiones, incluidas las conversiones numéricas y las conversiones de argumentos de tipos

  • Llamadas a métodos con más de dos argumentos

  • Captadores de propiedades con más de dos argumentos

  • Establecedores de propiedades con argumentos

  • Asignación a un indizador

  • Operadores booleanos && y ||

Constantes locales

No se admiten constantes locales.

Alias de importación

No se admiten los alias de importación.

Declaraciones de variables

No puede declarar nuevas variables explícitas en las ventanas del depurador. Sin embargo, puede asignar nuevas variables implícitas en la ventana Inmediato . Estas variables implícitas se encuentran en el ámbito de la sesión del depurador y no están accesibles fuera del depurador. Por ejemplo, la instrucción o = 5 crea implícitamente una nueva variable o y le asigna el valor 5. Estas variables implícitas son de tipo Object , a menos que el depurador pueda deducir el tipo.

Palabras clave no admitidas

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • Palabras clave de espacio de nombres o de módulo como, por ejemplo, End Sub o Module.