Предположим, что процесс, запущенный под GDB, останавливается из-за получения сигнала, например, SIGSEGV
из-за доступа к неверному местоположению. Затем я фиксирую местоположение (записывая в регистр или любым другим способом) и хочу выполнить одношаговое повторное выполнение неисправной инструкции.
Существует команда stepi
, которая будет работать, если сигнал был проигнорирован или не был получен в первую очередь. Но так как есть ожидающий сигнал, я не могу использовать его, по крайней мере, напрямую. Если я использую команду signal 0
, она будет игнорировать сигнал, но тогда она будет работать как continue
. Таким образом, если я использую signal 0
, мне нужно выяснить, где начинается следующая инструкция, добавить к ней tb
и т. Д. Это неудобно.
Другой способ будет выглядеть так: handle SIGSEGV ignore
, за которым следует stepi
, а затем еще одна команда handle
для восстановления исходного состояния. Также неудобно: не может даже define
функция «черного ящика» для этого, так как исходное состояние обработки сигнала может быть нестандартным, и у него будут проблемы с его восстановлением после si
.
Итак, есть ли простой способ удалить ожидающий сигнал без продолжения выполнения?