Как заставить gdb отправлять внешнее уведомление о получении сигнала? - PullRequest
1 голос
/ 31 января 2011

Я отлаживаю запуск приложения-демона в режиме переднего плана внутри gdb в сеансе tmux. Этот демон иногда падает с SIGSEGV. Результаты этого сбоя не сразу очевидны для внешнего мира, поэтому мне может потребоваться некоторое время, чтобы обнаружить, что демон разбился. Я хотел бы получить какое-то уведомление сразу, когда происходит сбой, даже электронная почта в порядке. Я не нашел помощи от человека GDB. Как (если вообще) это достигается?

~ $ gdb --version
GNU gdb (Gentoo 7.2 p1) 7.2

Ответы [ 2 ]

0 голосов
/ 13 марта 2011

Похоже, я решил эту проблему, вернувшись к ней через некоторое время. Подсказка о $ _exitcode в одном из ответов для Сделать gdb автоматически завершающим работу при успешном завершении? поставили меня на путь, и какое-то приближение к поиску оказалось gdb hooks .

После некоторых экспериментов, это то, что у меня сейчас есть для .gdbinit этого приложения. Приятно то, что я могу различать сигналы, поэтому обычные команды kill дают мне нормальный полный выход из трехголового монстра (tmux + gdb + app), в то время как все необычное выпадет в оболочку gdb и выкачает письмо и жди меня в tmux для диагностики:

set $_exitcode = -999
set height 0
handle SIGTERM nostop print pass
handle SIGPIPE nostop
define hook-stop
    if $_exitcode != -999
        quit
    else
        shell echo | mail -s "NOTICE: app has stopped on unhandled signal" root
    end
end
echo .gdbinit: running app\n
run
0 голосов
/ 31 января 2011

Что-то дешевое и безобразное:

while sleep 30 ; ps auxw | grep progname | grep " t "` && mail -s CRASHED username@host < /etc/hostname ; done

Если вы хотите, чтобы он отправлял только один раз по почте;), тогда еще многое предстоит сделать. Но по электронной почте каждые 30 секунд, пока вы не убьете, это может быть просто уловкой.

...