Я отлаживаю приложение C ++ для Ubuntu 10.04, которое иногда получает SIGKILL
сигнал.
я бы хотел ловить сигнал и не дать ему убить выполнение, просто чтобы узнать, смогу ли я получить полезную информацию о состоянии приложения в этот конкретный момент.
Чтение GDB документация Я нашел handle
команда, поэтому я попытался применить его к сигналу SIGKILL:
(gdb) handle SIGKILL stop nopass
Signal Stop Print Pass to program Description
SIGKILL Yes Yes No Killed
Итак, насколько я понимаю, это правильно:
stop
GDB should stop your program when this signal happens. This implies the print keyword as well.
print
GDB should print a message when this signal happens.
nopass
GDB should not allow your program to see this signal.
однажды SIGKILL
сигнал испускается, gdb
должен как-то его перехватить, напечатать сообщение, остановить выполнение и не дать приложению убить себя, верно?
Проблема в том, что этого не происходит, и приложение закрывается.
Вы знаете, как я мог ловить сигнал?
Полезная информация:
Из юникса Сигнал (7) справочная страница:
The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
Таким образом, отладчик может установить обработчик, но это не имеет никакого смысла. ОС напрямую выполняет необходимые действия. Если SIGKILL может быть обработан из приложения, у ОС нет шансов завершить работу сломанного приложения. По этой причине SIGKILL немного специальный 🙂