Как сгенерировать SIGINT при использовании XCode для отладки? - PullRequest
7 голосов
/ 08 июля 2011

Мое консольное приложение перехватывает SIGINT, поэтому оно может корректно завершиться.

Нажатие CTRL + C внутри XCode во время отладки программы, однако, не имеет никакого эффекта.

Я могу найти процесс и использовать окно терминала для отправки SIGINT своему процессу, однако я надеюсь, что есть более простое решение, которое я могу сделать в XCode.

Ответы [ 5 ]

5 голосов
/ 06 января 2012

Кнопка pause на консоли отладчика фактически отправляет SIGINT в ваше приложение.Если вы хотите, чтобы отладчик передавал сигнал вашему приложению, вы можете сделать следующее:

  1. Нажмите кнопку pause на отладчике и дождитеськонсоль отладки для фокусировки
  2. Введите handle SIGINT pass и нажмите ENTER
  3. Нажмите кнопку Продолжить

Теперь снова нажмите кнопку Pause на консоли отладчика Xcode, чтобы SIGINT попал в ваше приложение.

Если вы не хотите, чтобы отладчик остановил сразутак как SIGINT перехватывается, вы также можете добавить handle SIGINT nostop в предыдущий список.

4 голосов
/ 13 июня 2017

Обновление для 2017 / Xcode 8 : правильные команды для информирования lldb о вашем намерении обработать прерывания:

process handle SIGINT -s false
process handle SIGINT -p true

По моему опыту, даже с указанными выше командами, функция pause отладчика все равно будет прерывать приложение и передавать управление указателю стека отладчика, однако pkill -2 appname в терминале вызовет вашу Функция прерывания без какого-либо взаимодействия с отладчиком, например:

void on_signal(int sig) {
  is_interrupted = 1;
}

int main(int argc, const char * argv[]) {
  signal(SIGINT, on_signal);
  // ... do stuff
}
3 голосов
/ 09 апреля 2016

В Xcode 5+ (llvm):

  1. Приостановить процесс

  2. В приглашении (llvm) введите process signal SIGINT

  3. Возобновить выполнение

2 голосов
/ 12 августа 2011

Одним из решений является использование команд UNIX kill или killall.

Если вам известен идентификатор процесса, вы можете открыть приложение «Терминал» и набрать:

kill -SIGINT 415

(где 415 - PID для этого процесса)

Или, может быть, проще, вы можете набрать

killall -SIGINT my_console_app

(где my_console_app - это имя вашего приложения, то есть имя созданного двоичного файла, а не пакета, если оно в одном)

Это отправит сигнал всем экземплярам приложения, как следует из названия killall, поэтому оно может быть неуместным. Возможно, стоит проверить, выполняются ли другие процессы с таким же именем, прежде чем выполнить killall (;

1 голос
/ 09 июля 2011

Одним из способов обойти работу с прерываниями является создание MainMenu с ярлыком CTRL-C, который выполняет запрошенную подпрограмму или отправляет себе SIGINT, если вам действительно нужен сигнал.

...