visual tag studio code closing change brackethighlighter visual-studio breakpoints trace

visual-studio - tag - visual studio code prettify code



¿Qué expresiones están permitidas en los puntos de rastreo? (2)

Al crear un punto de rastreo en Visual Studio (haga clic con el botón derecho en el punto de interrupción y seleccione "Cuando toque ..."), el cuadro de diálogo tiene este texto, el énfasis es mío:

Puede incluir el valor de una variable u otra expresión en el mensaje colocándolo entre llaves ...

¿Qué expresiones están permitidas?


Como dice Kurt Hutchinson, la asignación de cadenas no está permitida en un punto de rastreo. Puedes solucionar esto creando un método que asigne la variable de cadena y llama a eso.

public static class Helper { public static void AssignTo(this string value, out string variable) { variable = value; } }

Luego en tu mensaje de punto de seguimiento:

{"new string value".AssignTo(out stringVariable)}


La documentación de Microsoft es bastante escasa en los detalles exactos de lo que está y no está permitido. La mayor parte de lo siguiente se encontró por prueba y error en la ventana Inmediato. Tenga en cuenta que esta lista es para C ++, ya que eso es lo que escribo. Creo que en C #, algunos de los artículos prohibidos a continuación están realmente permitidos.

La mayoría de las expresiones básicas se pueden evaluar, incluidas la conversión, la configuración de variables y las funciones de llamada.

Restricciones generales
  • Sólo se admiten los modelos de estilo C; no static_cast, dynamic_cast, reinterpret_cast, const_cast
  • No se pueden declarar nuevas variables o crear objetos
  • No puedo usar operadores sobrecargados
  • El operador ternario no funciona
  • No se puede usar el operador de coma porque Visual Studio lo usa para formatear el resultado de la expresión ; utilizar múltiples conjuntos de llaves para expresiones múltiples
Llamadas de función
  • Llamadas prohibidas:
    • Lambdas (no puedo definirlas o llamarlas)
    • Funciones en un espacio de nombres anónimo
    • Funciones que toman objetos por valor (porque no puedes crear objetos)
  • Llamadas permitidas:
    • Funciones miembros, tanto regulares como virtuales.
    • Funciones que toman referencias o punteros, a tipos fundamentales o de clase
    • Pasando variables dentro del alcance
    • Usando "&" para pasar punteros a variables en el alcance
    • Pasando los literales "verdadero", "falso", números
    • Pasar literales de cadena, siempre y cuando no se oponga a la regla de "no se pueden crear objetos"
    • Llamar a múltiples funciones con un punto de rastreo mediante el uso de múltiples conjuntos de llaves
Asignación Variable
  • Prohibido:
    • Objetos
    • Literales de cuerda
  • Permitido:
    • Variables con tipos fundamentales, valor de literales u otras variables.
    • Direcciones de memoria, después de la conversión: { *(bool*)(0x1234) = true }
    • Registros: { @eip = 0x1234 }

Casos de uso

Las funciones de llamada de puntos de rastreo pueden ser bastante potentes. Puede sortear la mayoría de las restricciones enumeradas anteriormente con una función de configuración cuidadosa y la llamada correcta. Aquí hay algunas ideas más específicas.

Forzar un si

Bastante sencillo: configure un punto de rastreo para establecer una variable y forzar una condición if en verdadero o falso, según lo que necesite probar. Todo sin añadir código ni salir de la sesión de depuración.

Punto de interrupción "alternar"

He visto la pregunta un par de veces: "Necesito interrumpir un punto que recibe muchos golpes. Me gustaría simplemente habilitar ese punto de interrupción desde otro punto de interrupción, por lo que el que me importa solo obtiene saltos de un determinado código. camino. ¿Cómo puedo hacer eso? " Con nuestro conocimiento anterior, es fácil, aunque necesita una variable auxiliar.

  1. Crea un booleano global, establecido en falso.
  2. Cree un punto de interrupción en su destino final, con una condición para romper solo cuando la bandera global sea verdadera.
  3. Establezca puntos de rastreo en los puntos críticos que asignan la bandera global a verdadero.

Lo bueno es que puede mover los puntos de rastreo sin dejar la sesión de depuración. Use la ventana Inmediato o la ventana Ver para restablecer su marca global, si necesita hacer otra corrida. Cuando haya terminado, todo lo que necesita para limpiar es ese booleano global. No hay otro código para eliminar.

Saltar código automáticamente

El registro EIP (al menos en x86) es el puntero de instrucción. Si lo asigna, puede cambiar el flujo de su programa.

  1. Busque la dirección de la línea a la que desea saltar , divídala una vez y observe el valor de EIP, ya sea en la ventana de Registros o en la ventana de Vigilancia con "@ eip, x". (Tenga en cuenta que el valor en la ventana Registros es hexadecimal, pero sin el "0x" inicial).
  2. Agregue un punto de rastreo en la línea de la que desea omitir , con una expresión como {@eip = address} , usando la dirección del paso 1.
  3. La asignación de EIP se realizará antes de que se ejecute algo en la línea.

Aunque esto puede ser útil, tenga cuidado porque omitir un código como este puede causar un comportamiento extraño.