[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]  


8. Отладка на уровне машинного кода

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

8.1 Исследование машинного кода

Чтобы включить поддержку отладки на уровне машинного кода, выберите `Source => Display Machine Code'. Когда она включена, появляется дополнительное окно машинного кода, которое показывает код текущей функции.(31) Перемещая квадратик в правой части разделяющей линии между окном исходника и машинного кода, вы можете изменять размер этих окон.

PICS/ddd-code

Окно машинного кода работает во многом похоже на окно исходника. Вы можете устанавливать, сбрасывать или изменять точки останова, выбирая адрес и нажимая кнопки `Break' или `Clear'; также доступны обычные всплывающие меню. Точки останова и текущая выполняемая позиция отображаются одновременно и в окне исходного кода, и в окне машинного кода.

Кнопку `Lookup' можно применять для поиска машинного кода конкретной функции или функции по конкретному адресу. Просто щелкните на нужной позиции в одном окне и нажмите `Lookup', и увидите соответствующий код в другом окне.

Если исходный код недоступен, обновляется только окно машинного кода.

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

8.2 Выполнение машинного кода

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

Чтобы выполнить ровно одну машинную инструкцию, щелкните на кнопке `Stepi' или выберите `Program => Step Instruction'.

Чтобы продолжить до следующей инструкции в текущей функции, щелкните на кнопке `Nexti' или выберите `Program => Next Instruction'. Это похоже на `Stepi', но все вызовы подпрограмм выполняются без остановки.

При использовании GDB часто бывает полезно делать graph display /i $pc

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

8.3 Исследование регистров

DDD предоставляет окно регистров, в котором после каждого останова программы показываются значения машинных регистров. Чтобы включить это окно, выберите `Status => Registers'.(32)

PICS/ddd-registers

Если выбрать один из регистров, его имя скопируется в поле аргумента. Вы можете использовать его, например, в качестве значения для `Display', чтобы получить отображение его значения в окне данных.

8.4 Настройка окна машинного кода

Включение машинного кода через `Source => Display Machine Code' (см. раздел 8.1 Исследование машинного кода) переключает следующий ресурс:

Ресурс: disassemble (класс Disassemble)
Если это `on', окно исходного кода автоматически дизассемблируется. По умолчанию `off'. См. раздел 2.1.2 Ключи DDD, о ключах --disassemble и --no-disassemble.

Вы можете оставить дизассемблированный код в памяти, используя `Edit => Preferences => Source => Cache Machine Code':

Ресурс: cacheMachineCode (класс CacheMachineCode)
Следует ли кешировать дизассеблированный машинный код (`on', по умолчанию) или не следует (`off'). Для кеширования требуется больше памяти, но с ним DDD работает быстрее.

Вы можете изменять ширину отступа для машинного кода, используя `Edit => Preferences => Source => Machine Code Indentation':

Ресурс: indentCode (класс Indent)
На сколько столбцов следует делать отступ в машинном коде, чтобы оставалось достаточно места для показа позиций точек останова. По умолчанию 4.

Ресурс `maxDisassemble' говорит, какой объем кода нужно дизассемблировать. Если `maxDisassemble' равен 256 (по умолчанию), а текущая функция больше 256-ти байт, DDD дизассемблирует только первые 256 байт от текущей позиции. Вы можете установить ресурс `maxDisassemble' в большее значение, если предпочитаете более обширный обзор машинного кода.

Ресурс: maxDisassemble (класс MaxDisassemble)
Максимальное число дизассемблируемых байт (по умолчанию 256). Если значение этого ресурса равно нулю, текущая функция дизассемблируется полностью.


[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]