我的控制台应用程序陷阱SIGINT
,因此可以正常退出。
在调试程序时,在XCode中按 CTRL + C 但是没有效果。
我可以找到进程并使用终端窗口向我的进程发送SIGINT
,但我希望有一个更简单的解决方案,我可以在XCode中完成。
答案 0 :(得分:5)
调试器控制台的暂停按钮实际上会向您的应用发送 SIGINT 。 如果您想让调试器传递信号到您的应用,您可以执行以下操作:
handle SIGINT pass
,然后按 ENTER 现在再次按下Xcode调试器控制台的暂停按钮将使SIGINT点击你的应用程序。
如果您不希望调试器在 SIGINT 被捕获后立即停止,您可能还需要将handle SIGINT nostop
添加到上一个列表中。
答案 1 :(得分:3)
在Xcode 5+(llvm)中:
暂停流程
在(llvm)
提示符下,输入process signal SIGINT
恢复执行
答案 2 :(得分:3)
2017 / Xcode 8更新:正确的命令,用于告知lldb您处理中断的意图:
process handle SIGINT -s false
process handle SIGINT -p true
根据我的经验,即使使用上述命令,调试器的暂停功能仍会中断应用程序并控制调试器的堆栈指针,但是终端上的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 :(得分:2)
一种解决方案是使用UNIX kill
或killall
命令。
如果您知道进程ID,则可以打开终端应用程序并键入:
kill -SIGINT 415
(其中415是此过程的PID)
或者,或许更容易,您可以输入
killall -SIGINT my_console_app
(其中my_console_app
是您的应用的名称,即创建的二进制文件的名称 - 如果它在一个中,则不是捆绑包)
这会将信号发送到应用程序的所有实例,如名称killall
所示,因此可能不合适。在执行killall
之前,可能值得检查是否有其他具有相同名称的进程正在运行(;
答案 4 :(得分:1)
使用中断的麻烦的一个解决方法是使主菜单具有CTRL-C快捷方式,执行您所请求的例程,或者如果您确实需要信号,则自己发送SIGINT