Как сгенерировать SIGINT при использовании XCode для отладки?

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

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

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


person Adam Davis    schedule 08.07.2011    source источник


Ответы (5)


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

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

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

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

person alediaferia    schedule 06.01.2012
comment
Больше не работает с XCode 6, который использует отладчик llvm. - person Lothar; 04.08.2015
comment
@Lothar Я добавил ответ для Xcode 5 и выше: stackoverflow.com/a/36521995/1255551 - person craig65535; 09.04.2016
comment
@wobbals добавил решение для XCode 8 и выше (например, 10.0): stackoverflow.com/a/44516465/1032277 - person Liviu; 28.06.2018

Обновление для 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
}
person wobbals    schedule 13.06.2017

В Xcode 5+ (llvm):

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

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

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

person craig65535    schedule 09.04.2016
comment
XCode 8 и выше (например, 10.0): см. решение @wobbals stackoverflow.com/a/44516465/1032277 - person Liviu; 28.06.2018

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

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

kill -SIGINT 415

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

Или, возможно, проще, вы можете ввести

killall -SIGINT my_console_app

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

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

person drfrogsplat    schedule 12.08.2011

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

person AWF4vk    schedule 08.07.2011