GDB: программно удалить точку наблюдения

Можно ли удалить точку наблюдения, не зная номер точки наблюдения?

Я использую команды, прикрепленные к точке останова, чтобы установить точку наблюдения в ячейке памяти. Я хотел бы очистить точку наблюдения на другой точке останова, но я не могу понять, как очистить точку наблюдения без номера точки наблюдения. Есть ли команда, которая может удалить точку наблюдения по месту в памяти?

2 ответа

Решение

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

(gdb) watch y
(gdb) set $foo_bp=$bpnum
Hardware watchpoint 2: y
(gdb) p $foo_bp
$1 = 2
(gdb) delete $foo_bp

Как насчет сохранения номера точки наблюдения и последующего удаления точки наблюдения с использованием этого номера?

Это пример. У меня есть программа на C++. Я установил три точки наблюдения при достижении точки останова в строке 5. Для точки наблюдения #2 я сохраняю командный файл GDB, чтобы удалить его позже. Когда достигается точка останова на 9, я просто выполняю этот командный файл GDB:

Это main.cpp:

#include <stdio.h>
int main()
{
  int v3=2, v2=1, v1 =0 ;
  printf("Set a watchpoint\n");

  v1 = 1;
  v1 = 2;
  printf("Clear the watchpoint\n");

  v1 = 3;
  v1 = 4;

  return 0;
}

Это.gdbinit:

file ./a.out
b 5
commands
watch v2
watch v1
set pagination off
shell rm -f all_watchpoints
set logging file all_watchpoints
set logging on
info watchpoints
set logging off
shell rm -f delete_my_watchpoint
shell tail -n 1 all_watchpoints | awk ' {print "delete "$1 }' > delete_my_watchpoint
watch v3
echo Done\n
c
end
b 9
commands
source delete_my_watchpoint
info watchpoints
end
r

Это просто измененная версия.gdbinit, которая вместо сохранения файла с командой удаления точки наблюдения сохраняет номер точки наблюдения:

file ./a.out
b 5
commands
watch v2
watch v1
set pagination off
shell rm -f all_watchpoints
set logging file all_watchpoints
set logging on
info watchpoints
set logging off
shell rm -f delete_my_watchpoint
shell tail -n 1 all_watchpoints | awk ' {print "set $watchpoint_to_delete_later="$1 }' > save_my_watchpoint_number
source save_my_watchpoint_number
shell rm -f save_my_watchpoint_number
shell rm -f all_watchpoints
watch v3
echo Done\n
c
end
b 9
commands
delete $watchpoint_to_delete_later
info watchpoints
end
r

Если вы установите точку наблюдения, используя адрес следующим образом:

(gdb) watch *((int*)0x22ff44)
Hardware watchpoint 3: *((int*)0x22ff44)
(gdb) info watchpoints
Num     Type           Disp Enb Address    What
3       hw watchpoint  keep y              *((int*)0x22ff44)  

Вы также можете позже найти этот адрес, так как он отображается в info watchpoints

(gdb) set logging file all_watchpoints
(gdb) set logging on
Copying output to all_watchpoints.
(gdb) info watchpoints
Num     Type           Disp Enb Address    What
3       hw watchpoint  keep y              *((int*)0x22ff44)
4       hw watchpoint  keep y              *((int*)0x22ff48)
5       hw watchpoint  keep y              *((int*)0x22ff4B)
(gdb) set logging of
Done logging to all_watchpoints.
(gdb) shell grep 0x22ff48 all_watchpoints
4       hw watchpoint  keep y              *((int*)0x22ff48)
(gdb) shell grep 0x22ff48 all_watchpoints | awk ' {print $1}'
4
(gdb) shell grep 0x22ff48 all_watchpoints | awk ' {print "delete "$1}' > delete_watchpoint
(gdb) source delete_watchpoint
(gdb) info watchpoints
Num     Type           Disp Enb Address    What
3       hw watchpoint  keep y              *((int*)0x22ff44)
5       hw watchpoint  keep y              *((int*)0x22ff4B)
Другие вопросы по тегам