Поделиться через


Доступ к глобальным переменным

Имена глобальных переменных хранятся в файлах символов, которые создаются при компиляции приложения. Отладчик интерпретирует имя глобальной переменной как виртуальный адрес. Любая команда, которая принимает адрес в качестве параметра, также принимает имя переменной. Поэтому для чтения или записи глобальных переменных можно использовать все команды, описанные в разделе Доступ к памяти по виртуальному адресу .

Кроме того, можно использовать ? (Вычисление выражения) команда для отображения адреса, связанного с любым символом.

WinDbg предоставляет элементы пользовательского интерфейса, которые можно использовать (в дополнение к командам) для просмотра и редактирования глобальных переменных. См. раздел Просмотр и изменение глобальных переменных в WinDbg (классическая модель).

Рассмотрим следующий пример. Предположим, что вы хотите изучить глобальную MyCounter переменную, которая представляет собой 32-разрядное целое число. Также предположим, что для радикса по умолчанию используется значение 10.

Вы можете получить адрес этой переменной, а затем отобразить его следующим образом.

0:000> ? MyCounter 
Evaluate expression: 1244892 = 0012fedc
0:000> dd 0x0012fedc L1 
0012fedc  00000052

Первый вывод команды сообщает, что адрес MyCounter 0x0012FEDC. Затем можно использовать команду d* (display Memory), чтобы отобразить одно двойное слово на этом адресе. (Можно также использовать 1244892, которая является десятичной версией этого адреса. Однако большинство программистов на языке C предпочитают использовать 0x0012FEDC.) Вторая команда сообщает, что значение MyCounter равно 0x52 (десятичное число 82).

Эти действия также можно выполнить в следующей команде.

0:000> dd MyCounter L1 
0012fedc  00000052

Чтобы изменить значение на десятичное MyCounter значение 83, используйте следующую команду.

0:000> ed MyCounter 83 

В этом примере используются десятичные входные данные, так как этот формат кажется более естественным для целого числа. Однако выходные данные команды d\* по-прежнему сохраняются в шестнадцатеричном формате.

0:000> dd MyCounter L1 0012fedc  00000053