Обработка сигналов с помощью GDB

Я отлаживаю приложение 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 должен как-то его перехватить, напечатать сообщение, остановить выполнение и не дать приложению убить себя, верно?

Проблема в том, что этого не происходит, и приложение закрывается.

Вы знаете, как я мог ловить сигнал?

Полезная информация:

  • Часть кода, которая выполняется, когда сигнал испускается, выполняется в другой теме.
  • версия GDB: 4.4.3
  • версия g ++: 7,1

4

Решение

Из юникса Сигнал (7) справочная страница:

  The  signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

Таким образом, отладчик может установить обработчик, но это не имеет никакого смысла. ОС напрямую выполняет необходимые действия. Если SIGKILL может быть обработан из приложения, у ОС нет шансов завершить работу сломанного приложения. По этой причине SIGKILL немного специальный 🙂

5

Другие решения


По вопросам рекламы [email protected]