debugging 使用XCode进行调试时,如何生成SIGINT?

3phpmpom  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(169)

我的控制台应用程序捕获SIGINT,以便它可以正常退出。
但是,在调试程序时,在XCode中按Ctrl+C不会产生任何效果。
我可以找到该进程,并使用终端窗口向我的进程发送SIGINT,但是我希望有一个更简单的解决方案可以在XCode中实现。

cnh2zyt3

cnh2zyt31#

调试器控制台的暂停按钮实际上会向您的应用发送SIGINT。如果您希望调试器将信号传递给您的应用,您可以执行以下操作:
1.按下调试器的pause按钮,等待调试控制台获得焦点
1.键入handle SIGINT pass并按ENTER
1.按下继续按钮
现在,再次按下Xcode调试器控制台的Pause按钮将使SIGINT命中您的应用程序。
如果您不希望调试器在捕获SIGINT后立即停止,您可能还需要将handle SIGINT nostop添加到前面的列表中。

lymgl2op

lymgl2op2#

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
}
ivqmmu1c

ivqmmu1c3#

在Xcode 5+(llvm)中:
1.暂停进程
1.在(llvm)提示下,输入process signal SIGINT
1.继续执行

3z6pesqy

3z6pesqy4#

一种解决方案是使用UNIX killkillall命令。
如果您知道进程ID,则可以打开终端应用程序并键入:

kill -SIGINT 415

(其中415是此进程的PID)
或者,也许更简单,您可以键入

killall -SIGINT my_console_app

(其中my_console_app是应用的名称,即创建的二进制文件的名称-如果它在一个包中,则不是包的名称)
这将把信号发送给应用程序的 * 所有 * 示例,正如名称killall所暗示的那样,因此它可能不合适。

irlmq6kh

irlmq6kh5#

解决中断问题的一个方法是创建一个带有CTRL-C快捷方式的MainMenu,该快捷方式执行您请求的例程,或者如果您确实需要sig,则向其自身发送一个SIGINT

oug3syen

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!

相关问题