10

コンソールアプリがトラップSIGINTされるため、正常に終了できます。

ただし、プログラムのデバッグ中にXCode内でCTRL+を押しても効果はありません。C

プロセスを見つけてターミナルウィンドウを使用しSIGINTてプロセスに送信することはできますが、XCode内で実行できるより簡単なソリューションがあることを望んでいます。

4

5 に答える 5

7

デバッガコンソールの一時停止ボタンは、実際にSIGINTをアプリに送信します。デバッガーにシグナルをアプリに渡させる場合は、次の操作を実行できます。

  1. デバッガーの一時停止ボタンを押して、デバッグコンソールがフォーカスを取得するのを待ちます
  2. 入力してEnterキーhandle SIGINT passを押します
  3. 続行ボタンを押します

Xcodeのデバッガコンソールの[一時停止]ボタンをもう一度押すと、SIGINTがアプリにヒットします。

SIGINTがキャッチされたらすぐにデバッガーを停止したくない場合は、前のリストに追加することもできます。handle SIGINT nostop

于 2012-01-06T03:38:20.657 に答える
5

2017年のアップデート/ Xcode8:割り込みを処理する意図をlldbに通知するための適切なコマンド:

process handle SIGINT -s false
process handle SIGINT -p true

私の経験では、上記のコマンドを使用しても、デバッガーの一時停止機能によってアプリが中断され、デバッガーのスタックポインターに制御が渡されますがpkill -2 appname、ターミナルのaは、デバッガーとの対話なしで割り込み機能をトリガーします。たとえば、次のようになります。

void on_signal(int sig) {
  is_interrupted = 1;
}

int main(int argc, const char * argv[]) {
  signal(SIGINT, on_signal);
  // ... do stuff
}
于 2017-06-13T08:44:31.763 に答える
4

Xcode 5+(llvm)の場合:

  1. プロセスを一時停止します

  2. (llvm)プロンプトで、次のように入力しますprocess signal SIGINT

  3. 実行を再開する

于 2016-04-09T20:01:21.303 に答える
2

1つの解決策は、UNIXkillまたはkillallコマンドを使用することです。

プロセスIDがわかっている場合は、ターミナルアプリケーションを開いて次のように入力できます。

kill -SIGINT 415

(ここで、415はこのプロセスのPIDです)

または、おそらくもっと簡単に、入力することができます

killall -SIGINT my_console_app

my_console_appアプリの名前、つまり作成されたバイナリの名前はどこにありますか。バンドルに含まれている場合はバンドルではありません)

これにより、名前が示すように、アプリケーションのすべてのインスタンスにシグナルが送信されるため、killall適切でない場合があります。killall(;を実行する前に、同じ名前の他のプロセスが実行されているかどうかを確認する価値があるかもしれません。

于 2011-08-12T05:11:54.573 に答える
1

割り込みを処理する手間を省くための回避策の1つは、要求されたルーチンを実行するCTRL-Cショートカットを使用してMainMenuを作成するSIGINTか、本当にsigが必要な場合はそれ自体を送信することです。

于 2011-07-08T20:20:04.293 に答える