Как прочитать окно памяти отладки в Visual Studio

Я использовал режим отладки в Visual Studio раньше, но мне никогда не приходилось использовать окно памяти. Если бы у меня было простое приложение, которое вычисляет a = b + c и делало b = 8 и c = -2, как я могу найти адреса a, b и c в окне памяти и их значения без использования часов?

Когда я пытался, я видел тонны «тарабарщины», которые я не могу понять. Вот скриншот:

Введите описание изображения здесь

Если бы я хотел сделать то же самое, но в среде Linux, как я мог бы добиться этого?

6

Решение

Один из способов найти адрес переменной в Visual Studio — использовать окно QuickWatch (в меню отладки, если вы не знаете горячую клавишу, Ctrl + Alt + Q). Если вы печатаете &a, он будет отображать адрес переменной a, Затем вы можете ввести этот адрес в окне памяти. Или вы можете просто войти &a в окне памяти.

Но чтобы увидеть все переменные в окне памяти, они должны быть в пределах нескольких байтов друг от друга, так как оно показывает непрерывную память. Для локальных переменных в стеке это обычно не будет проблемой. Для целочисленных переменных вы можете легче просматривать их в удобочитаемом формате, щелкнув правой кнопкой мыши в окне памяти и изменив макет (например, выберите 4-байтовые целые числа со знаком со знаком).

Сказав все это, кажется, что было бы намного проще использовать окно наблюдения, поскольку все уже хорошо помечено, и легко определить, какое значение связано с какой переменной.

12

Другие решения

Я видел тонны «тарабарщины»: маленький пример может помочь (особенно для следующих читателей 🙂

  1. Скопируйте / вставьте следующий код и отладьте его:

    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. Запустите отладчик Visual Studio, добавьте наблюдение ко всем переменным (щелкните правой кнопкой мыши каждую переменную и нажмите «Добавить наблюдение»). Теперь, если он не открыт, откройте окно просмотра (меню отлаживатьОкно → * Watch) и перетащите переменную adresse_int_variable из окна просмотра в окно памяти. Вы получите следующее:

    Введите описание изображения здесь

  3. Вы заметите, что значение 41 появляется по этому адресу. В шестнадцатеричном, 0x41 равен 65. Таким образом, вы видите, что адрес переменной int_variable фактически содержит 65. (Обратите внимание, что в действительности память содержит биты: 01000001, но она представлена ​​в шестнадцатеричном формате для удобства чтения.)

  4. Войти &int_variable2 в окне памяти вы получите:

    Введите описание изображения здесь

    int_variable2 держит значение 10000и в шестнадцатеричном виде это 0x2710, Теперь ищите значения, хранящиеся для переменных char_variable_1 а также char_variable_2: ты видишь 0x41 а также 0x42, Это способ A а также B закодированы в ASCII таблица. Обратите внимание, что в памяти int_variable а также char_variable_1 подобные.

  5. Наконец введите &mystruct в окне памяти, и вы увидите:

    Введите описание изображения здесь

    Это соответствует памяти mystruct переменная, которая содержит четыре переменные ( int и три charс). Вы видите age переменная (10000 = 0x2710) и три следующих символа: A , B а также 65 которые хранятся как 0x41, 0x42, 0x41 (справа налево). Обратите внимание, что в правой части окна вы можете увидеть ABA в виде строкового представления памяти (если нет, щелкните правой кнопкой мыши окно и выберите ANSI).

  6. Попробуйте с более сложными переменными, читайте о порядок байт а также выравнивание структуры данных. Смотрите также страница окна памяти на MSDN.

3

Попробуйте сделать это с символом * и открыть его адрес в окне памяти. Будет проще интерпретировать его вывод. Что касается среды Linux, я думаю, вы можете использовать этот учебник на GDB: http://www.ofb.net/gnu/gdb/gdb_56.html

Это довольно интересно посмотреть что-то вроде этого время от времени 🙂

0

Пришлось посмотреть код разборки и выяснить значения регистров.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector