Сигналы при отладке - PullRequest
9 голосов
/ 26 мая 2011

Я разрабатываю приложение (сервис / демон, действительно) для Linux на C ++, которое должно взаимодействовать с частью аппаратного обеспечения. Если моя программа не освобождает ресурсы для этой части аппаратного обеспечения при завершении, то мне нужно перезагрузить драйвер устройства, процесс, который занимает около 10 минут, и по понятным причинам приходится ждать 10 минут между каждым тестом программы. быть разочаровывающим.

Итак, я использовал функцию sigaction() для перехвата SIGINT (ctrl-c), чтобы моя программа могла полностью завершить работу, когда я закончу с ней. При запуске программы из консоли это работает нормально. Однако при отладке в Netbeans или Eclipse (я пробовал оба) вещи не работают.

  • В Eclipse, если я нажимаю ctrl-c в консоли, которую он предоставляет, кажется, что он не регистрирует, что SIGINT когда-либо происходил
  • В Eclipse, если я запускаю программу в режиме отладки и затем использую kill -SIGINT <pid>, программа просто прерывается, как если бы она достигла точки останова
  • Netbeans, кажется, на самом деле понимает, что сигнал был отправлен, когда я нажал ctrl-c в консоли, и появляется диалоговое окно с вопросом, хочу ли я переслать его в приложение. Нажатие «Вперед и продолжить», кажется, просто нарушает программу, и приложение не получает сигнал. В нем также сказано, что я могу настроить этот материал в Debug -> Dbx configure, элемент меню, который не существует
  • В Netbeans, если я запускаю программу в режиме отладки, а затем использую kill -SIGINT <pid>, поведение будет таким же, как указано выше
  • Затем я добавил обработчик SIGQUIT и попытался отправить его через kill при отладке в Netbeans. На этот раз диалоговое окно не появляется, и обработчик сигнала никогда не отключается.

Мне нужен какой-то способ чистого завершения работы моего приложения во время отладки. Есть идеи?

Ответы [ 3 ]

7 голосов
/ 27 июня 2011

Оказывается, проблема не имела ничего общего с Netbeans или Eclipse, а скорее с gdb.

gdb можно настроить для обработки сигналов различными способами.Если вы запустите:

gdb

, введите:

info signals

Вы получите список сигналов и действий GDB для какихчто делать, если он получает этот сигнал:

Signal        Stop      Print   Pass to program  Description

SIGHUP        Yes       Yes     Yes              Hangup
SIGINT        Yes       Yes     No               Interrupt
SIGQUIT       Yes       Yes     Yes              Quit
SIGILL        Yes       Yes     Yes              Illegal instruction
SIGTRAP       Yes       Yes     No               Trace/breakpoint trap

и т. д.

Моя временная работа была в том, чтобы использовать SIGALRM, который по умолчанию GDB не прерывает и не отправляет процессу.Однако вы также можете настроить параметры GDB по умолчанию, создав файл .gdbinit, в котором вы можете установить эти

7 голосов
/ 22 января 2015

Даже этот пост старый, надеюсь, он может помочь другим.

Чтобы Eclipse не мог перехватить Ctrl + C, вы можете настроить свой GDB с помощью файла .gbdinit. Вы создаете .gdinit с этим содержанием

#we want Ctrl+C to be no break, pass to application and printed by the debugger 
handle SIGINT nostop
handle SIGINT pass
handle SIGINT print

В вашей конфигурации eclipse вы можете определить, где находится ваш файл .gdbinit для использования в вашей конфигурации Debug

Eclipse capture

2 голосов
/ 26 мая 2011

Простое решение. Попробуйте использовать макросы DEBUG, чтобы справиться с ситуацией.

// Register the signal handler to stop service.
#ifdef _DEBUG
        signal(SIGKILL, <your signal handler>);
#endif

Также вы можете попытаться очистить свое приложение перед выходом.

...