Покорение вершин отладки Крис Касперски Хакер, номер #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 удаляет точки наблюдения с первой по шестую включительно и никакого подтверждения при этом не запрашивается, так что будь на чеку! |