Сбой процесса в отладчике; как мне это убить
У меня есть приложение 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...