iOSシミュレーターでテスト中にエラーが発生しました: ブートストラップサーバーに登録できませんでした 質問する

iOSシミュレーターでテスト中にエラーが発生しました: ブートストラップサーバーに登録できませんでした 質問する

シミュレーターでアプリをテストしていたところ、UIAlertViewのボタンをクリックするとクラッシュしました。そこでデバッグを中止し、コードにいくつか変更を加えてアプリを再度ビルドしました。アプリケーションを実行すると、コンソールにこのエラーが表示されます。

com.myApp.debug をブートストラップ サーバーに登録できませんでした。エラー: 不明なエラー コード。これは通常、このプロセスの別のインスタンスが既に実行されているか、デバッガーでハングしていることを意味します。プログラムはシグナル「SIGABRT」を受信しました。

シミュレーターからアプリを削除し、クリーンビルドを実行してみましたが、アプリを実行しようとするとこのエラーが引き続き発生します。

シミュレーターでアプリを再度実行できるようにするにはどうすればいいですか?

ベストアンサー1

ステータス:これは、最近の Mac OS 10.8 および Xcode 4.4 でも確認されています。

tl;dr:これは、デバイス上で実行している場合とシミュレータ上で実行している場合の 2 つのコンテキストで発生する可能性があります。デバイス上で実行している場合は、デバイスを切断して再接続すると問題が解決するようです。

マイク・アッシュが提案

launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove

これは常に機能するわけではありません。実際、私の場合は一度も機能したことがありませんが、明らかに機能するケースもあります。ただ、どのケースかはわかりません。ですから、試してみる価値はあります。

それ以外の場合、この問題を解決する唯一の方法は、ユーザーの launchd を再起動することです。再起動するとそれが実行されますが、それほど劇的ではない/より速い方法があります。別の管理者ユーザーを作成する必要がありますが、これは一度だけ行う必要があります。問題が発生した場合は、自分自身としてログアウトし、そのユーザーとしてログインし、メインユーザーに属する launchd を強制終了します。例:

sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`

をメインのユーザー名に置き換えますuser_id。通常のユーザーとして再度ログインすると、正常な状態に戻ります。少し面倒ですが、完全な再起動よりは楽です。

詳細:

これは、Lion/Xcode 4.2 でより頻繁に発生するようになりました。(個人的には、その組み合わせより前では見たことがありませんでした。)

このバグは launchd にあるようです。デバッガーがデバッグを停止したときにアプリ プロセスを終了せずに子として継承します。これは通常、アプリがゾンビになり、ps でプロセス ステータスが Z になることで示されます。

根本的な問題は、launchd に実装されているブートストラップ ネーム サーバーにあるようです。これは (私が理解している限りでは)、アプリケーション ID を mach ポートにマッピングします。バグがトリガーされると、アプリケーションは終了しますが、ブートストラップ サーバーのネーム サーバー マップから消去されず、その結果、ブートストラップ サーバーは、アプリケーションの別のインスタンスが同じ名前で登録されることを拒否します。

ゾンビに対してlaunchd を強制的に実行すれば問題が解決するだろうと期待されていました (コメントを参照) が、wait()解決しませんでした。根本的な問題はゾンビ状態ではなく (ゾンビの中には無害なものもあります)、ブートストラップ ネーム サーバーであり、launchd を強制終了する以外にこれを解消する方法は知られていません。

このバグは、Xcode、gdb、およびユーザーの launchd の間で何か問題が起こったために発生したようです。iPhone シミュレーターでアプリを実行し、gdb 内で停止してから、iPad シミュレーターでビルドと実行を行うことで、このウェッジを繰り返しました。シミュレーターの切り替え (iOS 4.3/iOS 5、iPad/iPhone) に敏感なようです。常に発生するわけではありませんが、シミュレーターを頻繁に切り替える場合はかなり頻繁に発生します。

ログイン中に launchd を強制終了すると、セッションが台無しになります。ログアウトして再度ログインしても、ユーザーの launchd は強制終了されません。OS X は既存のプロセスを維持します。再起動すれば問題は解決しますが、面倒です。上記の手順の方が速いです。

ちなみに、Apple にバグを報告しました。rdar://10330930

おすすめ記事