10

My console app traps SIGINT so it can exit gracefully.

Pressing CTRL+C inside XCode while the program is being debugged, though, has no effect.

I can find the process and use a terminal window to send a SIGINT to my process, however I'm hoping there's a simpler solution that I can do within XCode.

4

5 回答 5

7

调试器控制台的暂停按钮实际上会向您的应用程序发送一个SIGINT。如果您想让调试器将信号传递给您的应用程序,您可以执行以下操作:

  1. 按下调试器的暂停按钮,等待调试控制台获得焦点
  2. 键入handle SIGINT pass并按ENTER
  3. 继续按钮

现在再次按下 Xcode 调试器控制台的暂停按钮将使 SIGINT 命中您的应用程序。

如果您不希望调试器在SIGINT被捕获后立即停止,您可能还需要添加到上一个列表中。handle SIGINT nostop

于 2012-01-06T03:38:20.657 回答
5

2017 / Xcode 8 更新:用于通知 lldb 您处理中断的意图的正确命令:

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

根据我的经验,即使使用上述命令,调试器的暂停功能仍会中断应用程序并让出对调试器堆栈指针的控制,但是pkill -2 appname终端上的 a 将触发您的中断功能,而无需与调试器进行任何交互,例如:

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

int main(int argc, const char * argv[]) {
  signal(SIGINT, on_signal);
  // ... do stuff
}
于 2017-06-13T08:44:31.763 回答
4

在 Xcode 5+ (llvm) 中:

  1. 暂停进程

  2. (llvm)提示符下,输入process signal SIGINT

  3. 恢复执行

于 2016-04-09T20:01:21.303 回答
2

一种解决方案是使用 UNIXkillkillall命令。

如果您知道进程 ID,您可以打开终端应用程序并输入:

kill -SIGINT 415

(其中 415 是此进程的 PID)

或者,也许更简单,您可以键入

killall -SIGINT my_console_app

my_console_app您的应用程序的名称在哪里,即创建的二进制文件的名称 - 如果它在一个包中,则不是捆绑包)

顾名思义,这会将信号发送到应用程序的所有实例killall,因此可能不合适。在执行killall(;

于 2011-08-12T05:11:54.573 回答
1

使用中断的麻烦的解决方法之一是使用 CTRL-C 快捷方式创建 MainMenu 来执行您请求的例程,或者SIGINT如果您确实需要 sig,则向自身发送 a 。

于 2011-07-08T20:20:04.293 回答