2008-11-07 30 views
7

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

Error: symbol "func" not found
Error: argument list does not match function
Error: member function not present

¿Alguien alguna vez tienen éxito en hacer este trabajo correctamente? ¿Qué me estoy perdiendo aquí?

Editar:. claridad, la función llamada debe ser un símbolo que existe en el ámbito actual del depurador está en

Respuesta

10

Ok, esto es lo que encontré
CXX0040 significa que "The C expression evaluator does not support implicit conversions involving constructor calls."
CXX0047 significa que "Overloaded functions can be called only if there is an exact parameter match or a match that does not require the construction of an object."

Así combinarse significa que si deseo 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 la conversión de 'String' a 'const String&'.
"construcción" parece incluir una construcción de copia trivial. por lo tanto, pasar por valor cualquier cosa que no sea un tipo primitivo dará como resultado un error.

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

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

+0

He venido aquí en la búsqueda de cómo invocar una función particular en VS para el momento de la depuración * (por cierto, estoy trabajando con C#) *, fue difícil de encontrar, así que dejaré un comentario aquí: * * Cómo llamar a una función en Visual Studio Debugger **: abra «Depuración → Ventana → Inmediato», y simplemente escriba en la ventana «Inmediato» una función para evaluar. –

0

La ventana de inspección está limitado por el contexto en el que el código actual es, por ejemplo, cuando su el código ingresa 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 del reloj, asegúrese de que esté visible y accesible desde el alcance actual.

+0

Esto no es un problema. cualquier función que intento invocar es visible desde el punto de código actual. – shoosh

+0

Especifique ese hecho en su pregunta, entonces. Debería haber aclarado en lugar de responder, al parecer. –

0

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

+2

¿Duele entonces que el mensaje de error diga algo así como "lo siento, solo funciona para el código administrado?". uh. – shoosh

0

Nos parece que esto funciona de una manera muy al azar. Algunas funciones muy simples (incluidas las funciones de miembro) funcionan, generalmente son simples getters de propiedades. Otras funciones más complejas no funcionan y dan un error.

nunca he sido capaz de discernir las reglas precisas ...

0

no he probado esto, pero siempre he pensado que era lo que la ventana inmediata fue de (código que se ejecuta)

Cameron

0

Es la ventana "inmediata" que desea. Y estás limitado a lo que es visible desde donde está tu punto de interrupción actual. Variables locales y funciones en esa clase (o globales)

0

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

Cuestiones relacionadas