Pregunta

Aquí hay algo que sé que probablemente sea posible, pero nunca he logrado hacer
En VS2005 (C ++), durante la depuración, para poder invocar una función del código que estoy depurando.
Esta característica a veces es esencial cuando se depuran estructuras de datos complejas que no se pueden explorar fácilmente utilizando solo las capacidades normales de la ventana de observación.
La ventana de observación parece permitir escribir llamadas de función, pero cada vez que lo intento me da un error u otro.

Error: símbolo " func " no encontrado
Error: la lista de argumentos no coincide con la función
Error: la función miembro no está presente

¿Alguien logró hacer que esto funcione correctamente? ¿Qué me estoy perdiendo aquí?

Editar: claramente, la función llamada debe ser un símbolo que exista en el alcance actual en el que se encuentra el depurador.

¿Fue útil?

Solución

Ok, esto es lo que encontré
CXX0040 significa que " El evaluador de expresiones C no admite conversiones implícitas que involucran llamadas de constructor. "
CXX0047 significa que " Las funciones sobrecargadas solo se pueden invocar si hay una coincidencia exacta de parámetros o una coincidencia que no requiere la construcción de un objeto. "

Combinado significa que si quiero llamar a una función, ninguno de los argumentos debería tener una conversión implícita y ninguno de los argumentos debería necesitar una construcción.
" conversión implícita " en este contexto parece incluir cosas triviales como convertir 'String' en 'const String & amp;' .
" construcción " parece incluir una copia trivial de construcción. así que pasar por valor cualquier cosa que no sea un tipo primitivo dará como resultado un error.

Entonces, esto básicamente deja funciones que solo toman punteros o tipos primitivos.
Acabo de probar esta teoría con éxito.

Entonces, si desea poder llamar a un método desde la ventana de observación, agregue una sobrecarga que solo tome punteros y primitivas y en la ventana de observación pase los argumentos adecuadamente. Para pasar un objeto que no es primitivo, pase su dirección.

Otros consejos

La ventana de observación está limitada por el contexto en el que su código actual es, por ejemplo, cuando su código ingresa a una función e intenta acceder a otra función que está oculta del alcance de su función actual, no funcionará.

Si invoca una función en la ventana de observación, asegúrese de que sea visible y accesible desde el alcance actual.

Que yo sepa, no puede ejecutar código desde la ventana Watch mientras se depura C ++ no administrado. Esto funciona para C # (y probablemente VB.NET y C ++ administrado, pero no estoy seguro de eso). Es muy probable que lo permita porque funciona para algunos idiomas, pero no para otros.

Encontramos que esto funciona de manera muy impredecible. Funcionan algunas funciones muy simples (incluidas las funciones miembro), generalmente los captadores de propiedades simples. Otras funciones más complejas no funcionan y dan un error.

Nunca he podido discernir las reglas precisas ...

No he probado esto, pero siempre pensé que para eso estaba la ventana inmediata (código de ejecución)

Cameron

Es el " Inmediato " ventana que quieras. Y está limitado a lo que es visible desde donde está su punto de interrupción actual. Variables locales y funciones en esa clase (o globales)

En mi experiencia, hay algunas deficiencias con la ventana inmediata. No puede llamar a las funciones miembro de sus clases si las clases provienen de una DLL diferente, pero recibe mensajes de error engañosos. Si algo está en la misma DLL (por ejemplo, al vincular estáticamente todas las demás cosas), llamar a los miembros es bastante confiable. Pero las cosas complejas pueden o no funcionar, como lo han mencionado otros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top