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


Отладка в режиме сборки

Если у вас есть исходные файлы C или C++ для приложения, вы можете использовать отладчик гораздо эффективнее при отладке в режиме исходного кода.

Однако во многих случаях невозможно выполнить отладку исходного кода. Возможно, у вас нет исходных файлов для приложения. Возможно, вы выполняете отладку чужого кода. Возможно, вы не создали исполняемые файлы с полными символами PDB. И даже если вы можете выполнить отладку исходного кода в приложении, может потребоваться трассировать подпрограммы Microsoft Windows, которые вызываются приложением или которые используются для загрузки приложения.

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

Дизассемблированное код

Отладчик в основном анализирует двоичный исполняемый код. Вместо отображения этого кода в необработанном формате отладчик выполняет дизассемблирование этого кода. То есть отладчик преобразует код из машинного языка в язык ассемблера.

Полученный код (известный как дизассемблирующий код) можно отобразить несколькими способами:

  • Команда u (Unassemble) дизассемблирует и отображает указанный раздел языка компьютера.

  • Команда uf (Unassemble Function) дизассемблирует и отображает функцию.

  • Команда up (Unassemble from Physical Memory) дизассемблирует и отображает указанный раздел языка компьютера, хранящийся в физической памяти.

  • Команда your (Unassemble Real Mode BIOS) дизассемблирует и отображает указанный 16-разрядный код в реальном режиме.

  • Команда ux (Unassemble x86 BIOS) дизассемблирует и отображает набор инструкций кода BIOS на основе x86 по указанному адресу.

  • (Только WinDbg) Окно дизассемблирования дизассемблирования и отображает указанный раздел языка компьютера. Это окно автоматически активируется, если в меню окна выбрана команда автоматически открывать дизассемблированноесодержимое . Это окно также можно открыть, выбрав дизассемблирование в меню представления, нажав клавиши ALT+7 или нажав кнопку дизассемблирования (ALT+7).

Дизассемблированное отображение отображается в четырех столбцах: смещение адреса, двоичный код, мнемонический язык ассемблера и сведения о языке ассемблера. В следующем примере показано это отображение.

0040116b    45          inc         ebp            
0040116c    fc          cld                        
0040116d    8945b0      mov         eax,[ebp-0x1c] 

Справа от строки, представляющей текущий счетчик программы, отображаются значения всех расположений памяти или регистров, к которым осуществляется доступ. Если эта строка содержит инструкцию ветви, отображается нотация [br=1] или [br=0] . Эта нотация указывает на ветвь, которая является или не взята соответственно.

Вы можете использовать команду .asm (Change Disassembly Options) (Изменить параметры дизассемблированного кода), чтобы изменить способ отображения дизассемблированных инструкций.

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

Для управления кодом сборки можно также использовать следующие команды:

  • Команда # (поиск шаблона дизассемблата) выполняет поиск определенного шаблона в области памяти. Эта команда эквивалентна поиску по четырем столбцам дизассембла.

  • Команда (Assemblye) может принимать инструкции сборки и преобразовываться в двоичный код компьютера.

Режим сборки и режим источника

Отладчик имеет два разных режима работы: режим сборки и режим источника.

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

Несколько команд создают различные отображения данных в зависимости от режима.

В WinDbg окно дизассемблирования автоматически перемещается на передний план при запуске или пошаговом выполнении приложения в режиме сборки. В режиме источника окно Источник перемещается на передний план.

Чтобы задать режим, можно выполнить одно из следующих действий.

  • Для управления режимом используйте команду l+, l- (Задать параметры источника ). Команда l-t активирует режим сборки.

  • (Только WinDbg) Снимите флажок Режим источника в меню Отладка , чтобы отладчик перевелся в режим сборки. Вы также можете нажать кнопку Режим источника выкл . на панели инструментов.

В WinDbg, когда вы находитесь в режиме сборки, ASM отображается в строке состояния.

Контекстное меню в окне дизассемблирования WinDbg содержит инструкции Выделить из текущей команды исходной строки . Эта команда выделяет все инструкции, соответствующие текущей строке источника. Часто одна строка источника соответствует нескольким инструкциям сборки. Если код оптимизирован, эти инструкции сборки могут быть не последовательными. Команда Выделить инструкции из текущей исходной строки позволяет найти все инструкции, собранные из текущей исходной строки.

Исходные файлы языка ассемблера

Если приложение было написано на языке ассемблера, дизассембля, созданная отладчиком, может не совпадать с исходным кодом. В частности, NO-OPs и комментарии не будут присутствовать.

Если вы хотите отлаживать код, ссылаясь на исходные ASM-файлы, необходимо использовать отладку в исходном режиме. Вы можете загрузить файл сборки, например исходный файл C или C++. Дополнительные сведения об этом виде отладки см. в разделе Отладка в исходном режиме.