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

时间:2011-07-08 17:18:12

标签: xcode debugging sigint

我的控制台应用程序陷阱SIGINT,因此可以正常退出。

在调试程序时,在XCode中按 CTRL + C 但是没有效果。

我可以找到进程并使用终端窗口向我的进程发送SIGINT,但我希望有一个更简单的解决方案,我可以在XCode中完成。

5 个答案:

答案 0 :(得分:5)

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

  1. 按下调试器的暂停按钮,等待调试控制台获得焦点
  2. 键入handle SIGINT pass,然后按 ENTER
  3. 继续按钮
  4. 现在再次按下Xcode调试器控制台的暂停按钮将使SIGINT点击你的应用程序。

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

答案 1 :(得分:3)

在Xcode 5+(llvm)中:

  1. 暂停流程

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

  3. 恢复执行

答案 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 killkillall命令。

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

kill -SIGINT 415

(其中415是此过程的PID)

或者,或许更容易,您可以输入

killall -SIGINT my_console_app

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

这会将信号发送到应用程序的所有实例,如名称killall所示,因此可能不合适。在执行killall之前,可能值得检查是否有其他具有相同名称的进程正在运行(;

答案 4 :(得分:1)

使用中断的麻烦的一个解决方法是使主菜单具有CTRL-C快捷方式,执行您所请求的例程,或者如果您确实需要信号,则自己发送SIGINT