我的控制台应用程序捕获SIGINT,以便它可以正常退出。但是,在调试程序时,在XCode中按Ctrl+C不会产生任何效果。我可以找到该进程,并使用终端窗口向我的进程发送SIGINT,但是我希望有一个更简单的解决方案可以在XCode中实现。
SIGINT
cnh2zyt31#
调试器控制台的暂停按钮实际上会向您的应用发送SIGINT。如果您希望调试器将信号传递给您的应用,您可以执行以下操作:1.按下调试器的pause按钮,等待调试控制台获得焦点1.键入handle SIGINT pass并按ENTER1.按下继续按钮现在,再次按下Xcode调试器控制台的Pause按钮将使SIGINT命中您的应用程序。如果您不希望调试器在捕获SIGINT后立即停止,您可能还需要将handle SIGINT nostop添加到前面的列表中。
handle SIGINT pass
handle SIGINT nostop
lymgl2op2#
2017年更新/ Xcode 8:用于通知lldb您处理中断的意图的正确命令:
process handle SIGINT -s false process handle SIGINT -p true
根据我的经验,即使使用上述命令,调试器的pause功能仍会中断应用程序并将控制权交给调试器的堆栈指针,但在终端的pkill -2 appname将触发中断函数,而无需与调试器进行任何交互,例如:
pkill -2 appname
void on_signal(int sig) { is_interrupted = 1; } int main(int argc, const char * argv[]) { signal(SIGINT, on_signal); // ... do stuff }
ivqmmu1c3#
在Xcode 5+(llvm)中:1.暂停进程1.在(llvm)提示下,输入process signal SIGINT1.继续执行
(llvm)
process signal SIGINT
3z6pesqy4#
一种解决方案是使用UNIX kill或killall命令。如果您知道进程ID,则可以打开终端应用程序并键入:
kill
killall
kill -SIGINT 415
(其中415是此进程的PID)或者,也许更简单,您可以键入
killall -SIGINT my_console_app
(其中my_console_app是应用的名称,即创建的二进制文件的名称-如果它在一个包中,则不是包的名称)这将把信号发送给应用程序的 * 所有 * 示例,正如名称killall所暗示的那样,因此它可能不合适。
my_console_app
irlmq6kh5#
解决中断问题的一个方法是创建一个带有CTRL-C快捷方式的MainMenu,该快捷方式执行您请求的例程,或者如果您确实需要sig,则向其自身发送一个SIGINT。
oug3syen6#
针对XCode 12+的更新
在现代版本的XCode中,很难截获SIGINT。为了调试,最好使用SIGINFO代替SIGINT。您可以在终端中使用^T(CTRL+T)生成SIGINFO。因此,在调试过程中,在代码中临时将SIGINT替换为SIGINFO。要拦截SIGINFO,请尝试以下所有步骤:1.转至“产品”〉“方案”〉“编辑方案”〉“运行”〉“选项”,并将控制台从“使用Xcode”更改为“使用终端”。1.运行程序1.暂停程序1.在Xcode控制台中,输入以下内容:
(lldb) process handle -p true -s false -n false SIGINFO
您将获得:
NAME PASS STOP NOTIFY =========== ===== ===== ====== SIGINFO true false false
1.继续程序1.切换到“终端”并按CTRL+T。你的信号处理器就会开火。调试完成后,不要忘记返回SIGINT!
6条答案
按热度按时间cnh2zyt31#
调试器控制台的暂停按钮实际上会向您的应用发送SIGINT。如果您希望调试器将信号传递给您的应用,您可以执行以下操作:
1.按下调试器的pause按钮,等待调试控制台获得焦点
1.键入
handle SIGINT pass
并按ENTER1.按下继续按钮
现在,再次按下Xcode调试器控制台的Pause按钮将使SIGINT命中您的应用程序。
如果您不希望调试器在捕获SIGINT后立即停止,您可能还需要将
handle SIGINT nostop
添加到前面的列表中。lymgl2op2#
2017年更新/ Xcode 8:用于通知lldb您处理中断的意图的正确命令:
根据我的经验,即使使用上述命令,调试器的pause功能仍会中断应用程序并将控制权交给调试器的堆栈指针,但在终端的
pkill -2 appname
将触发中断函数,而无需与调试器进行任何交互,例如:ivqmmu1c3#
在Xcode 5+(llvm)中:
1.暂停进程
1.在
(llvm)
提示下,输入process signal SIGINT
1.继续执行
3z6pesqy4#
一种解决方案是使用UNIX
kill
或killall
命令。如果您知道进程ID,则可以打开终端应用程序并键入:
(其中415是此进程的PID)
或者,也许更简单,您可以键入
(其中
my_console_app
是应用的名称,即创建的二进制文件的名称-如果它在一个包中,则不是包的名称)这将把信号发送给应用程序的 * 所有 * 示例,正如名称
killall
所暗示的那样,因此它可能不合适。irlmq6kh5#
解决中断问题的一个方法是创建一个带有CTRL-C快捷方式的MainMenu,该快捷方式执行您请求的例程,或者如果您确实需要sig,则向其自身发送一个
SIGINT
。oug3syen6#
针对XCode 12+的更新
在现代版本的XCode中,很难截获SIGINT。为了调试,最好使用SIGINFO代替SIGINT。您可以在终端中使用^T(CTRL+T)生成SIGINFO。
因此,在调试过程中,在代码中临时将SIGINT替换为SIGINFO。要拦截SIGINFO,请尝试以下所有步骤:
1.转至“产品”〉“方案”〉“编辑方案”〉“运行”〉“选项”,并将控制台从“使用Xcode”更改为“使用终端”。
1.运行程序
1.暂停程序
1.在Xcode控制台中,输入以下内容:
您将获得:
1.继续程序
1.切换到“终端”并按CTRL+T。
你的信号处理器就会开火。
调试完成后,不要忘记返回SIGINT!