2012-09-17 14 views
6

He usado el modo de depuración en Visual Studio anteriormente, pero nunca tuve que usar la ventana de memoria. Si tuviera una aplicación simple que calcula a = b + c y se hiciera b = 8 yc = -2, ¿cómo puedo encontrar las direcciones a, b y c en la ventana de memoria y sus valores sin usar relojes?Cómo leer la ventana de memoria de depuración en Visual Studio

Cuando probé, vi toneladas de "galimatías" que no puedo tener mucho sentido de. Aquí hay una captura de pantalla:

Enter image description here

Si lo que quería hacer lo mismo, pero en un entorno Linux, ¿cómo podría lograr esto?

+0

¿por qué quiere la ubicación de la memoria de esas variables? –

Respuesta

12

Una forma de encontrar la dirección de una variable en Visual Studio es utilizar la ventana Inspección rápida (en el menú de depuración si usted no sabe la tecla de acceso rápido, Ctrl +Alt +Q). Si escribe &a, se mostrará la dirección de la variable a. Luego puede ingresar esa dirección en la ventana de memoria. O simplemente puede ingresar &a en la ventana de la memoria.

Pero para ver todas las variables con la ventana de memoria, que tendrían que ser dentro de unos pocos bytes de uno al otro, ya que demuestra memoria contigua. Para variables locales en la pila, eso normalmente no sería un problema. Para las variables enteras, puede verlas más fácilmente en un formato legible haciendo clic derecho en la ventana de la memoria y cambiando el diseño (por ejemplo, elija enteros de 4 bytes con una pantalla firmada).

Habiendo dicho todo esto, parece que sería mucho más fácil de usar la ventana de inspección ya que todo está muy bien marcado ya y es fácil saber qué valor se asocia con qué variable.

+0

Esto parece funcionar para una aplicación .NET (por ejemplo, para ver qué cadena Unicode * realmente * es) - * "expresión esperada" *. –

0

Intente hacer eso con un char * y abra su dirección en la ventana de Memoria. Será más sencillo interpretar su resultado. En cuanto al entorno Linux, supongo que se puede utilizar este tutorial sobre el BGF: http://www.ofb.net/gnu/gdb/gdb_56.html

Es bastante interesante ver something like this de vez en cuando :)

0

tuve que mirar el código desmontaje y averiguar los valores de los registros.

1

vi toneladas de "galimatías": un pequeño ejemplo puede ayudar (especialmente durante los siguientes lectores :)

  1. Copia/pega el siguiente código y depurarlo:

    struct MyStruct 
    { 
        int age; 
        char code_1; 
        char code_2; 
        char code_3; 
    }; 
    
    int main() 
    { 
        int int_variable = 65; 
    
        int* adresse_int_variable = &int_variable; 
    
        int int_variable2 = 10000; 
    
        char char_variable_1 = 'A'; 
    
        char char_variable_2 = 'B'; 
    
        cout << " sizeof(int_variable) " << sizeof(int_variable) << endl; 
        cout << " sizeof(char_variable_1) " << sizeof(char_variable_1) << endl; 
    
        MyStruct mystruct; 
        mystruct.age = int_variable2; 
        mystruct.code_1 = 'A'; 
        mystruct.code_2 = char_variable_2; 
        mystruct.code_3 = int_variable; 
        return 0; 
    } 
    
  2. Ejecute el depurador de Visual Studio, agregue el reloj a todas las variables (haga clic con el botón derecho en cada variable y haga clic en "Agregar reloj"). Ahora si no está abierto, abra la ventana del reloj (menú DepurarVentana → * Ver), y arrastre/suelte la variable adresse_int_variable de la ventana del reloj a la ventana de la memoria. Obtendrá el siguiente:

    Enter image description here

  3. usted observará que el valor 41 aparece en esta dirección. En hexadecimal, 0x41 es igual a 65.Así que ya ves que la dirección de la variable int_variable contiene efectivamente 65. (Tenga en cuenta que, en realidad, la memoria contiene bits:. 01000001, pero está representado en hexadecimal a la facilidad de la lectura)

  4. Introduzca &int_variable2 en la ventana de memoria, obtendrá:

    Enter image description here

    int_variable2 mantiene el valor 10000, y en hexadecimal es 0x2710. Ahora busque los valores almacenados para las variables char_variable_1 y char_variable_2: vea 0x41 y 0x42. Esta es la forma en que A y B están codificados en el ASCII Table. Tenga en cuenta que en la memoria int_variable y char_variable_1 son lo mismo.

  5. Finalmente entran &mystruct en la ventana de memoria, y verá lo siguiente:

    Enter image description here

    Esto corresponde a la memoria de la variable mystruct, que contiene cuatro variables (a int y tres char s) . Usted ve la variable age (10000 = 0x2710) y los tres siguientes caracteres: A, B y 65 que se almacena como 0x41, 0x42, 0x41 (de derecha a izquierda). Tenga en cuenta que en la parte derecha de la ventana puede ver ABA como una representación de cadena de la memoria (si no, haga clic con el botón derecho en la ventana y haga clic en ANSI).

  6. Pruebe con variables más complejas, lea sobre endianness y data structure alignment. Vea también el memory window page on MSDN.

Cuestiones relacionadas