Сбой процесса в отладчике; как мне это убить

У меня есть приложение C++, которое подключается через последовательный порт USB к микропроцессору (аналог Arduino). я использую termios.h как мой серийный фантик.

Я отлаживаю с помощью cgdb в Mac OS X 10.7.3,

Когда я:

  • cgdb build/my-process
  • Установите некоторые точки останова и т. Д., Сделайте отладку
  • Найдите ошибку или попробуйте выйти из еще запущенного процесса, используя kill внутри cgdb

процесс зависает. cgdb отказывается когда-либо убивать процесс - просто сидит там. Я уверен, что это потому, что если я kill с середины приложения я никогда не выпускаю /dev/ttyUSB устройство, через которое я получаю доступ к микроконтроллеру. Я не уверен, что что-то заблокировано и никогда не разблокировано, но cgdb никогда не выходит.

Я пробовал:

  • Основные прерывания: Ctrl + C
  • ps aux | grep 'my-process', убить -9 [pid] `.
  • ps aux | grep cgdb, kill -9 [pid],
  • sudo версии выше.

Ничто не убивает либо cgdb или процесс, запущенный в нем.

Если я отсоединяю USB-кабель (разрываю соединение с микропроцессором) (я думал, что это может привести к сбою сбойного процесса), я начинаю видеть, что используется ~50% доступного процессора (не знаю, на каком), и все блокируется. Мне не удается вывести приложение из строя.

Как вы: (а) выходите чисто, не блокируя все от cgdb или же gdb в то время как в процессе отладки процесса, или (b) kill / cleanly (хотя 'cleanly' будет просто заморозить торт) остановите процесс, который остановлен, пока вы отлаживаете его, который не отвечает на kill -9 без перезагрузки?

2 ответа

Решение

Вы не можете завершить процесс, ожидающий ввода-вывода. Это было правдой для большинства, если не для всех ядер Unix, с начала эпохи.

Это звучит как отладчик (или любой процесс, который ptraceдругой), который застрял в ожидании ввода / вывода, также не может быть убит.

ptrace или pgrep

Я хотел бы попробовать "pgrep -l cgdb" очень удобно для перечисления pid...

Другие вопросы по тегам