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

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

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

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


Аппаратные точки наблюдения на запись ячейки задаются командой watch (wa). Команды rwatch (rw) и awatch (aw) устанавливают точки наблюдения на чтение и чтение/запись, соответственно (например rw *0xBFFFFA50, а вот rw *$esp уже не срабатывает, и отладчик сообщает «Attempt to dereference a generic pointer»). Как и в случае с точками останова по выполнению, сообщение «Hardware read watchpoint N: адрес» не означает ровным счетом ничего, и при попытке запуска/продолжения выполнения программы отладчик может сказать: «Could not insert hardware watchpoint N», обламывая нас по полной программе.

Все точки наблюдения/останова могут быть условными, то есть срабатывать только в том случае, если значение выражения, стоящего после if, истинно, например: «b foo if $eax==0» или «rw *0xBFFFFA60 if (*((unsigned int*)$esp)!=0x669)».

При установке всякой точки наблюдения/останова отладчик присваивает ей номер, который, во-первых, высвечивается при ее срабатывании, а во-вторых, может быть использован в командах управления точками наблюдения/останова. Номер последней сработавшей точки останова автоматически заносится в переменную $bpnum.

В данном случае номер точки наблюдения/останова равен единице

(gdb) hb main

Hardware assisted breakpoint 1 at 0x80483ef

(gdb) r

Starting program: /home/kpnc/gdb/gdb_demo

Breakpoint 1, 0x080483ef in main ()

Команда ignore n x устанавливает счетчик игнорирования точки наблюдения/останова n, пропуская первые x срабатываний, что особенно полезно в циклах.

Если при срабатывании точки останова/наблюдения необходимо выполнить некоторую последовательность операций, можно воспользоваться командой commands n, где n – номер точки наблюдения/останова. Пример использования команды показан ниже:

Здесь при срабатывании точки номер 6 будет выведено приветствие «hello, world!»

commands 6

printf "hello, world\n"

ends

Получить информацию по точкам останова поможет команда info break (i b, или info watchpoints). При запуске без аргументов она выдаст данные о состоянии всех точек наблюдения/останова. Если же необходимо «проэкзаменовать» какую-то конкретную точку наблюдения/останова, достаточно указать ее номер, например:

Просмотр информации о точке наблюдения номер 13

(gdb) i b 13

Num Type Disp Enb Address What

13 read watchpoint keep y *134513676

stop only if $eax == 4

(gdb)

Команда clear (она же delete) используется для удаления точек наблюдения/останова. При запуске без аргументов она удаляет все точки (при этом отладчик запрашивает подтверждение). Если же необходимо убрать какую-то одну конкретную точку, достаточно задать ее номер, например delete 13. Кроме того, можно удалить целый диапазон точек останова/наблюдения: delete 1-6 удаляет точки наблюдения с первой по шестую включительно и никакого подтверждения при этом не запрашивается, так что будь на чеку!

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