Как сделать шаг, не передавая сигнал приложению? - PullRequest
0 голосов
/ 11 сентября 2018

Предположим, что процесс, запущенный под GDB, останавливается из-за получения сигнала, например, SIGSEGV из-за доступа к неверному местоположению. Затем я фиксирую местоположение (записывая в регистр или любым другим способом) и хочу выполнить одношаговое повторное выполнение неисправной инструкции.

Существует команда stepi, которая будет работать, если сигнал был проигнорирован или не был получен в первую очередь. Но так как есть ожидающий сигнал, я не могу использовать его, по крайней мере, напрямую. Если я использую команду signal 0, она будет игнорировать сигнал, но тогда она будет работать как continue. Таким образом, если я использую signal 0, мне нужно выяснить, где начинается следующая инструкция, добавить к ней tb и т. Д. Это неудобно.

Другой способ будет выглядеть так: handle SIGSEGV ignore, за которым следует stepi, а затем еще одна команда handle для восстановления исходного состояния. Также неудобно: не может даже define функция «черного ящика» для этого, так как исходное состояние обработки сигнала может быть нестандартным, и у него будут проблемы с его восстановлением после si.

Итак, есть ли простой способ удалить ожидающий сигнал без продолжения выполнения?

1 Ответ

0 голосов
/ 12 сентября 2018

В gdb версии 7.9 и более поздних, есть команда queue-signal, которая позволит вам отправить сигнал (или вообще никакого сигнала, если вы передадите ему 0 в качестве аргумента) следующийвремя, когда цель возобновляется.Вот некоторые из документов :

Очередь сигнал , которые должны быть немедленно доставлены в текущий поток при возобновлении выполнения потока.Сигнал может быть именем или номером сигнала.Обработка сигнала должна быть настроена на передачу сигнала программе, в противном случае GDB сообщит об ошибке.Вы можете управлять обработкой сигналов из GDB с помощью команды handle.

В качестве альтернативы, если signal равно нулю, любой текущий находящийся в очереди сигнал для текущего потока отбрасывается, а когда выполнение возобновляется, noсигнал будет доставлен.

Эта команда отличается от команды signal тем, что сигнал только поставлен в очередь, выполнение не возобновляется.И queue-signal нельзя использовать для передачи сигнала, состояние обработки которого было установлено на nopass.

...