Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

Покорение вершин отладки

Крис Касперски

Хакер, номер #095, стр. 095-118-2


Команда return, в отличии от finish, приводит к немедленному возвращению в материнскую функцию без выполнения оставшегося «хвоста». Soft-ice этого делать не умеет, а зря! return очень полезна и довольно часто используется при отладке.

Еще soft-ice не умеет вызывать функции, а gdb это делает без всякого напряжения командой call, за которой следует имя функции/переменная/регистр или адрес. Аргументы, если они есть, передаются в круглых скобках по Си-соглашению, то есть заносятся в стек справа налево и выталкиваются из стека все той же командой call, например: call foo(1,2,3) или call 0x8048384(1,2,3).

При желании можно даже выполнить команду оболочки, не выходя из отладчика. Это делается так: shell ls или shell man open. Фантастически удобно! Впрочем, аналогичного результата можно добиться, открыв дополнительную консоль.

Трассировка

С трассировкой связаны всего две команды: stepi n (si n) и nexti n (ni n). stepi n (si n) выполняет n следующих инструкций с заходом в циклы и функции, а nexti n (ni n) - без захода. При запуске без аргументов выполняется только одна инструкция. Нажатие на <Enter> автоматически повторяет последнюю команду (stepi или nexti), что значительно ускоряет трассировку. Кстати, лупить по <Enter'у> намного удобнее, чем давить на любую из функциональных клавиш, используемых для трассировки Windows-отладчиками.

Команды step n/next n (упоминание о которых можно найти в документации на gdb) ориентированы на работу с исходными текстами и выполняют n строк, а при отсутствии символьной информации трассируют программу вплоть до ее завершения, что не есть хорошо.

Точки останова

Отладчик gdb поддерживает два типа точек останова: останов по выполнению кода – breakpoint и останов по обращению к данным (также называемый точками наблюдения) — watch-point. Еще gdb поддерживает точки перехвата, но для отладки программ без исходных текстов они практически бесполезны.

Точки останова могут быть как программными, так и аппаратными. Программная точка останова по выполнению на x86-платформе представляет собой однобайтовую инструкцию CCh (INT 03h). Программный watch-point реализуется путем пошаговой трассировки программы с отслеживанием обращений к подопытной ячейке, что крайне непроизводительно, а, кроме того, некоторые программы просто не позволяют себя трассировать. Аппаратных точек останова на x86 всего четыре, программных же можно устанавливать сколько угодно.

Программная точка останова по исполнению задается командой break (b), за которой следует имя функции/адрес/регистр или переменная, например: b main, b *0x80484BC. Команда tbreak (tb) устанавливает одноразовую точку останова, которая автоматически удаляется при срабатывании. Аппаратная точка останова задается командой hbreak (hb), а временная аппаратная точка — командой thbreak (thb). После установки аппаратной точки останова отладчик сообщает: «Hardware assisted breakpoint N at адрес», но это еще не значит, что операция завершилась успешно. Для проверки можно установить хоть тысячу аппаратных точек останова, и все будет ОК, но вот только при запуске программы командами run или continue отладчик может сообщить: «Warning: Cannot insert hardware breakpoint N».

Назад на стр. 095-118-1  Содержание  Вперед на стр. 095-118-3