Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #51, ФЕВРАЛЬ 2005 г.

Особенности национальной отладки

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #051, стр. 051-096-4


Для отладки на уровне исходных текстов программа должна быть откомпилирована с отладочной информацией. В gcc за это отвечает ключ "-g". Если отладочная информация недоступна, GDB будет отлаживать программу на уровне дизассемблерных команд.

Обычно имя отлаживаемого файла передается в командной строке (gdb filename). Для отладки активного процесса укажи в командной строке его ID, а для подключения коды (core dump) воспользуйся ключом "–core==corename". Все три параметра можно загружать одновременно, попеременно переключаясь между ними командной target. Target exec переключается на отлаживаемый файл, target child - на приаттаченный процесс, а target core - на дамп коры. Необязательный ключ "-q" подавляет вывод копирайта.

Загрузив программу в отладчик, нужно установить точку останова. Для этого служит команда break (она же "b"). b main устанавливает точку останова на функцию main языка С, а b _start – на точку входа в ELF-файл (впрочем, в некоторых файлах она называется по-другому). Можно установить точку останова и на произвольный адрес: b *0x8048424 или b *$eax. Регистры пишутся маленькими буквами и предваряются знаком доллара. GDB понимает два "общесистемных" регистра: $pc (указатель команд) и $sp (стековый указатель). Только помни, что непосредственно после загрузки программы в отладчик никаких регистров у нее еще нет, и они появляются только после запуска отлаживаемо процесса на выполнение (команда run, она же "r").

Отладчик самостоятельно решает, какую точку останова установить – программную или аппаратную, и лучше ему не препятствовать (команда принудительной установки аппаратной точки останова (hbreak) работает не на всех версиях отладчика; в моей она не работает точно). Точки останова на данные в GDB называются "точками наблюдения" – watch point. Watch addr вызывает отладчик всякий раз, когда содержимое addr изменяется, а awatch addr – при чтении/записи в addr. Команда rwatch addr реагирует только чтение, но работает не во всех версиях отладчика. Просмотреть список установленных точек останова/наблюдения можно командой info break. Команда clear удаляет все точки останова, clear addr – все точки останова, установленные на данную функцию/адрес/номер строки. Команды enable/disable позволяют временно включать/отключать точки останова. Точки останова поддерживают развитый синтаксис условных команд, описание которого можно найти в документации. Команда continue ("c") возобновляет выполнение программы, прерванное точкой останова.

Команда next N ("n N")выполняет N-следующих строк кода без входа, а step N ("s N") - со входом во вложенные функции. Если N не задано по умолчанию, выполняется одна строка. Команды nexti/stepi делают то же самое, но работают не со сроками исходного текста, а с машинными командами. Обычно они используются совместно с командой display/i $pc ("x/i $pc"), предписывающей отладчику отображать текущую машинную команду. Ее достаточно вызывать один раз за сеанс.

Назад на стр. 051-096-3  Содержание  Вперед на стр. 051-096-5