Xcode でデバッグの実行時に Launching アプリ名... のまま進まないときの対処法
Xcode で稀によくデバッグ実行時に Launching ${アプリ名}...のまま永遠にアプリが起動しないことがあったのとその対処法(強引)がわかったのでそのメモ。
結論
$ pgrep -f '/Library/Apple/usr/libexec/oah/debugserver' | xargs kill -9
環境
- Xcode14.1
- macOS 12.6
背景
普段 iOS アプリの開発をしているのですが、まだ SwiftUI への移行が済んでなく Storyboard や Xib など Interface Builder を使用しています。
そこでレイアウト編集中に Cmd+Z
で戻りたいことがよくあるのですが、特定条件下[1]だとそれだけで Xcode がクラッシュします。
クラッシュするだけなら全然良いのですが(良くない)、シミュレータでデバッグ実行中に Xcode がクラッシュすると更なる問題が発生します。
それがタイトルにもある通り Xcode のステータスバーに Launching ${アプリ名}... と表示されたままアプリが起動せず無限の時間が流れる問題[2]です。
この問題が発生した場合、以下のことをやっても効果がありませんでした。
- Debug 再実行
- Clean ビルド
- Xcode 再起動
- シミュレータのアプリのプロセスをキル
- シミュレータのアプリをアンインストール
- シミュレータ再起動
唯一お手軽にできる解決策が「OS 再起動」になります。
が、一方で OS 再起動はそこそこめんどくさく頻繁にやりたいものではないのでもうちょっとお手軽にこの問題を解決できないか試してみました。
補足
なお Xcode14.1 や Xcode14.2 系では実行を繰り返していると同じく Launching ${アプリ名}...
で止まる問題が発生しているようです。
これはシミュレータ再起動(Simulator.app のメニューバー > Devices > Restart)をすると直るので、 Xcode14.2 以下を使ってる場合は一旦再起動を試してみることをオススメします。
参考:
原因
とりあえず Launching ${アプリ名}... で起動しない理由として、「アプリが既にどこかで起動しているのでは?」と雑に考えました。
そこで一旦ターミナルで以下のコマンドを実行してみます。
$ ps x | grep ${アプリ名}
そうすると以下のようなプロセスが存在することがわかりました。
55555 ?? TXs 0:30:00 ~/Library/Developer/CoreSimulator/Devices/${シミュレータのID}/data/Containers/Bundle/Application/${何かのID}/${アプリ名}.app/${アプリ名}
プロセス ID が 55555 なこいつがデバッグ実行を妨げているのでは?と思いとりあえず殺してみます。
$ kill -9 55555
ただし、これで 55555 なプロセスは死にません。実際にもう一度 ps コマンドを叩くと元気な様子がうかがえます。
$ ps x | grep ${アプリ名}
55555 ?? TXs 0:30:00 ~/Library/Developer/CoreSimulator/Devices/${シミュレータのID}/data/Containers/Bundle/Application/${何かのID}/${アプリ名}.app/${アプリ名}
SIGKILL を送っても死なない・・・? 🤔 ということで途端にこいつが怪しく思えてきます。
実際にこのプロセスはシミュレータの App Switcher で該当アプリを上にスワイプしたり、シミュレータをキルしても死にません。 G 並の生存力ですね。
プロセスが死なないときはいくつかの理由が考えられますが、誰かが握っている可能性が考えられると思います。
多分一番に考えつくのが親プロセスです。というわけで親プロセスを見つけてみましょう。
$ ps x | grep $(ps -o ppid= -p 55555)
55554 ?? S 0:00.67 /Library/Apple/usr/libexec/oah/debugserver --fd=6 --native-regs --setsid
debugserver
というのがアプリのプロセスの親みたいですね。
怪しい名前です。とりあえず殺しましょう。
$ kill -9 55554
すると、子プロセスの ${アプリ名} なプロセスも死にました。
$ ps x | grep ${アプリ名}
zsh: exit 1
それでもう一度アプリをデバッグ実行すると、なんと無事に実行できました!!! 🎉
不思議ですね(?)
なお結論にも書いてありますが以下は絶対 debugserver
殺すマンなワンライナーです。
$ pgrep -f '/Library/Apple/usr/libexec/oah/debugserver' | xargs kill -9
まとめ
というわけでかなり力任せな対応になりますが Launching ${アプリ名}... で永遠にアプリが起動できなくなったときは debugserver を殺してみましょう。
なおテンプレになりますが、私はこの方法で解決しましたが必ずしもこれで解決するとは限りません。
また私はこの対応で一度も問題は起きたことはありませんが、一応プロセスを強制終了させているので自己責任でお願いします。
Discussion