avanzada Visual Studio prueba de Kung-Fu - Llamar a las funciones de la ventana Inmediato durante la depuración

StackOverflow https://stackoverflow.com/questions/3011703

Pregunta

Veo algunas preguntas relacionadas se han preguntado, pero son demasiado avanzado para que agarre o que carecen de una guía paso a paso de principio a fin (la mayoría de ellos terminan siendo charla privilegiada de sus propios resultados del experimento ). Aceptar aquí está, da este sencillo programa:

#include <stdio.h>
#include <string.h>

int main()
{
    FILE * f;
    char buffer[100];

    memset(buffer, 0, 100);

    fun();

    f = fopen("main.cpp", "r");
    fread(buffer, 1, 99, f);
    printf(buffer);
    fclose(f);

    return 0;
}

Lo que hace es básicamente imprimir en sí (suponiendo que el nombre del archivo es main.cpp).

Pregunta

¿Cómo puedo hacer que imprima otro archivo, por ejemplo foobar.txt sin modificar el código fuente ? Tiene algo que ver con la ejecución a través de VS, dando un paso a través de las funciones y el secuestro del puntero a FILE justo antes fread() se llama. No hay necesidad de preocuparse por fugas de recursos llamando fclose().

Me trató la sencilla f = fopen("foobar.txt", "r") que dio

CXX0017: Error: symbol "fopen" not found

¿Alguna idea?

Editar

descubrí la solución se engancha en Depuración de Mozilla en Windows FAQ . El comando correcto para poner en la ventana Inmediato es

f = {,,MSVCR100D}fopen("foo.txt", "r")

Sin embargo, en realidad no responder a esta pregunta:

  • Todavía no entiendo lo que está pasando aquí.
  • ¿Cómo encontrar sistemáticamente la parte {,,MSVCR100D} un método dadas? Sé que la versión MSVCR cambios de sistema a sistema. ¿Cómo puedo averiguar eso?
  • ¿Alguien podría explicar la sintaxis de corchete, sobre todo, ¿cuáles son esos dos comas haciendo allí? ¿Hay más gemas ocultas utilizando esta sintaxis?
¿Fue útil?

Solución

La sintaxis entre llaves es el VS Contexto operador, que se rompe en su mayoría - como se explica en el enlace (o, al menos, casi una joya escondida). Se utiliza en cualquier lugar las necesidades de expresión-evaluación-motor VS para resolver funciones en tiempo de ejecución, por ejemplo, evaluar expresiones compuestas en la ventana de inspección, establecer puntos de interrupción, o (como testigo) en las ventanas de comandos / inmediata.

Su tercera argumento es el binario que incluye la implementación de la función que desea llamar. Para una función CRT como fopen, que por lo general equivale a -

  

MSVCR [versión VS] [D] .dll

(creo recordar la extensión que se necesitaba - pero tal vez eso cambió en VS2010). La 'D' indica la versión de depuración de DLL. El número de versión VS se decodifica como:. VS2005 -> 8, VS2008 -> 9, VS2010 -> 10

También tenga en cuenta la evaluación-motor tiene varias otras trampas a tener en cuenta.

Otros consejos

Para complementar excelente respuesta de Ofek, aquí hay una manera que he encontrado para encontrar sistemáticamente lo que una llamada de función del módulo pertenece. (Es decir, la parte MSVCR100D).

  • Paso a través del depurador en busca de una instancia de la función que desea llamar. (En este caso, yo estaba buscando fopen);
  • Cuando lo encuentre, paso a ella pulsando F11.
  • Haz clic derecho y seleccione Mostrar desmontaje
  • Usted puede encontrar la dirección de la instrucción que se está ejecutando. (Haga clic en torno a las Opciones de visualización para cambiar si no se muestra)
  • Abra la ventana de depuración Módulos (Alt + Ctrl + U)
  • Busque en la lista de módulos cargados con el rango de direcciones que abarca la dirección de la instrucción en curso. Bam, que ha encontrado el nombre del módulo para la función!

Creo que se puede utilizar este método para encontrar el nombre del módulo para cualquier clase. Esto puede ser útil cuando, por ejemplo, se está revisando una base de código grande y desea invocar el método de una clase arbitraria sobre la marcha en la ventana Inmediato. También es probable que pueda crear instancias de clases sobre la marcha llamando al constructor de sí mismo.

Ahora no era C ++ una lengua nativa? Casi nos sentimos como en un entorno administrado, secuencias de comandos aquí: P

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