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

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

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

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


Команда jump addr передает управление в произвольную точку программы, а call addr/fname – вызывает функцию fname с аргументами! Этого нету даже в soft-ice! А как часто оно требуется! Другие полезные команды: finish – продолжать выполнение до выхода из текущей функции (соответствует команде soft-ice "P RET"), until addr ("u addr") – продолжать выполнение, пока указанное место не будет достигнуто, при запуске без аргументов – остановить выполнение при достижении следующей команды (актуально для циклов!), return – немедленное возращение в дочернюю функцию.

Команда print выражение ("p выражение") выводит значение выражения (например, "p 1+2"), содержимое переменной ("p my_var"), содержимое регистра ("p $eax") или ячейку памяти ("p *0x8048424", "p *$eax"). Если нужно вывести несколько ячеек – воспользуйся командой x/Nh addr, где N – количество выводимых ячеек. Ставить символ звездочки перед адресом в этом случае не нужно. Команда info registers ("i r") выводит значение всех доступных регистров. Модификация содержимого ячеек памяти/регистров осуществляется командой set. Например, set $eax = 0 записывает в регистр eax ноль. set var my_var = $ecx присваивает переменной my_var значение регистра ecx, а set {unsigned char*}0x8048424=0xCC записывает по байтовому адресу 0x8048424 число 0xCC. disassemble _addr_from _addr_to выдает содержимое памяти в виде дизассемблерного листинга, формат представления которого определяется следующей командой: set disassembly-flavor.

Команды info frame, info args, info local отображают содержимое текущего фрейма стека, аргументы функции и локальные переменные. Для переключения на фрейм материнских функций служит команда frame N. Команда backtrace ("bt") делает то же самое, что и call stack в Windows-отладчиках. При исследовании дампов коры она незаменима.

Короче говоря, приблизительный сеанс работы с GDB выглядит так: грузим программу в отладчик, даем b main (а если не сработает, то b _start), затем "r", после чего отлаживаем программу по шагам: "n"/"s", при желании задав "x/i $pc", чтобы GDB показывал, что выполняется в данный момент. Выходим из отладчика командой quit ("q"). Описание остальных команд – в документации. Теперь, по крайней мере, ты не заблудишься в ней.

Заключение

Сравнение *nix-отладчиков с Windows-дебаггерами показывает значительное отставание последних и их непрофессиональную направленность. Трехмерные кнопки, масштабируемые иконки, всплывающие менюшки – все это, конечно, очень красиво, но жать <F10> до потери пульса лениво. В GDB проще написать макрос или использовать уже готовый (благо все, что только можно было запрограммировать, здесь сделали уже до тебя и меня).

Отладочные средства в *nix мощны и разнообразны (свет клином не сошелся на GDB), и единственное, чего ей недостает, – так это нормального ядерного отладчика системного уровня, ориентированно на работу с двоичными файлами без символьной информации и исходных тестов. Тяжелое детство и скитание по множеству платформ наложило на *nix тяжелый отпечаток и ничем не исстребимое стремление к переносимости и кросс-платформенности. Какое там хакерство в таких условиях! Впрочем, доступность исходных текстов делает эту проблему неактуальной.

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