Я использовал режим отладки в Visual Studio раньше, но мне никогда не приходилось использовать окно памяти. Если бы у меня было простое приложение, которое вычисляет a = b + c и делало b = 8 и c = -2, как я могу найти адреса a, b и c в окне памяти и их значения без использования часов?
Когда я пытался, я видел тонны «тарабарщины», которые я не могу понять. Вот скриншот:
Если бы я хотел сделать то же самое, но в среде Linux, как я мог бы добиться этого?
Один из способов найти адрес переменной в Visual Studio — использовать окно QuickWatch (в меню отладки, если вы не знаете горячую клавишу, Ctrl + Alt + Q). Если вы печатаете &a
, он будет отображать адрес переменной a
, Затем вы можете ввести этот адрес в окне памяти. Или вы можете просто войти &a
в окне памяти.
Но чтобы увидеть все переменные в окне памяти, они должны быть в пределах нескольких байтов друг от друга, так как оно показывает непрерывную память. Для локальных переменных в стеке это обычно не будет проблемой. Для целочисленных переменных вы можете легче просматривать их в удобочитаемом формате, щелкнув правой кнопкой мыши в окне памяти и изменив макет (например, выберите 4-байтовые целые числа со знаком со знаком).
Сказав все это, кажется, что было бы намного проще использовать окно наблюдения, поскольку все уже хорошо помечено, и легко определить, какое значение связано с какой переменной.
Я видел тонны «тарабарщины»: маленький пример может помочь (особенно для следующих читателей
Скопируйте / вставьте следующий код и отладьте его:
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;
}
Запустите отладчик Visual Studio, добавьте наблюдение ко всем переменным (щелкните правой кнопкой мыши каждую переменную и нажмите «Добавить наблюдение»). Теперь, если он не открыт, откройте окно просмотра (меню отлаживать → Окно → * Watch) и перетащите переменную adresse_int_variable
из окна просмотра в окно памяти. Вы получите следующее:
Вы заметите, что значение 41
появляется по этому адресу. В шестнадцатеричном, 0x41 равен 65. Таким образом, вы видите, что адрес переменной int_variable
фактически содержит 65. (Обратите внимание, что в действительности память содержит биты: 01000001, но она представлена в шестнадцатеричном формате для удобства чтения.)
Войти &int_variable2
в окне памяти вы получите:
int_variable2
держит значение 10000
и в шестнадцатеричном виде это 0x2710
, Теперь ищите значения, хранящиеся для переменных char_variable_1
а также char_variable_2
: ты видишь 0x41
а также 0x42
, Это способ A
а также B
закодированы в ASCII таблица. Обратите внимание, что в памяти int_variable
а также char_variable_1
подобные.
Наконец введите &mystruct
в окне памяти, и вы увидите:
Это соответствует памяти mystruct
переменная, которая содержит четыре переменные ( int
и три char
с). Вы видите age
переменная (10000 = 0x2710
) и три следующих символа: A
, B
а также 65
которые хранятся как 0x41
, 0x42
, 0x41
(справа налево). Обратите внимание, что в правой части окна вы можете увидеть ABA
в виде строкового представления памяти (если нет, щелкните правой кнопкой мыши окно и выберите ANSI).
Попробуйте с более сложными переменными, читайте о порядок байт а также выравнивание структуры данных. Смотрите также страница окна памяти на MSDN.
Попробуйте сделать это с символом * и открыть его адрес в окне памяти. Будет проще интерпретировать его вывод. Что касается среды Linux, я думаю, вы можете использовать этот учебник на GDB: http://www.ofb.net/gnu/gdb/gdb_56.html
Это довольно интересно посмотреть что-то вроде этого время от времени
Пришлось посмотреть код разборки и выяснить значения регистров.