【发布时间】:2011-10-01 11:07:59
【问题描述】:
我的控制台应用捕获了SIGINT,因此它可以正常退出。
但是,在调试程序时在 XCode 中按 CTRL+C 无效。
我可以找到进程并使用终端窗口向我的进程发送SIGINT,但是我希望有一个更简单的解决方案可以在 XCode 中完成。
【问题讨论】:
我的控制台应用捕获了SIGINT,因此它可以正常退出。
但是,在调试程序时在 XCode 中按 CTRL+C 无效。
我可以找到进程并使用终端窗口向我的进程发送SIGINT,但是我希望有一个更简单的解决方案可以在 XCode 中完成。
【问题讨论】:
调试器控制台的 pause 按钮实际上会向您的应用发送 SIGINT。 如果您想让调试器将信号传递到您的应用,您可以执行以下操作:
handle SIGINT pass,然后按ENTER
现在再次按下 Xcode 调试器控制台的 Pause 按钮将使 SIGINT 命中您的应用。
如果您不希望调试器在 SIGINT 被捕获后立即停止,您可能还需要将 handle SIGINT nostop 添加到上一个列表中。 p>
【讨论】:
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
}
【讨论】:
在 Xcode 5+ (llvm) 中:
暂停进程
在(llvm) 提示符下,输入process signal SIGINT
恢复执行
【讨论】:
一种解决方案是使用 UNIX kill 或 killall 命令。
如果您知道进程 ID,您可以打开终端应用程序并输入:
kill -SIGINT 415
(其中 415 是此进程的 PID)
或者,也许更简单,您可以键入
killall -SIGINT my_console_app
(其中my_console_app 是您的应用程序的名称,即创建的二进制文件的名称 - 如果它在一个包中,则不是捆绑包)
这会将信号发送到应用程序的所有个实例,正如名称killall 所暗示的那样,因此它可能不合适。在执行 killall (;
【讨论】:
处理中断的麻烦的解决方法之一是使用 CTRL-C 快捷方式创建 MainMenu 来执行您请求的例程,或者如果您确实需要 sig,则向自身发送SIGINT。
【讨论】: