ある日浮かんだアイディア
LLDBのマニュアルにはRemote Debugging
について説明している部分があります。
そして最近ish shell
やa-shell
など、iPhoneデバイス上でjailbreakしなくても「コマンド実行環境」を簡単に用意できるようになっていることから
もしかしたらリモートでiPhone端末に接続してデバッグすることができるかもしれない
と思いました。ここで「セキュリティー的にそんなことが出来るわけがない」と思った方もいるでしょう。この記事を書いている自分もそう思いましたが直接やってみて確認したかったので、検証してみました。
結論を先にお伝えしますと
予想通りjailbreakしないとできません
lldbはリモートデバッグ機能を提供していますが「iOSのセキュリティー・権限」の問題をjailbreakなしでは解決できないので、iPhone端末で動いているアプリのプロセスにAttachすることができません。(そもそもAttach以前にアクセスすらできない)
ここからは検証の手順と流れを共有します。
iphone端末側
①iPhone端末にdebugserver
のバイナリをcopyする
※バイナリのパス(MacOS 12.0.1)
/Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver
②ターゲットのプロセスを起動する(デバッグ対象)
③debugserver
でip,port, Attach対象を指定して実行する(Attach対象は②で起動したプロセス)```
$debugserver ip:port --attach=[ターゲット]
##### mac側
④lldbを実行する```
$lldb
```⑤platformのプラグインを指定する```
(lldb) platform select remote-ios```
⑥iPhone端末側のデバッグサーバにアクセスする```
(lldb) process connect connect://[iPhoneのIP]:[③で指定したポート]
問題と解決
(解決)iPhone端末のコマンド実行環境
→今回はiSH Shell
というiPhone向けアプリをインストールして使いました。
(解決)iPhone端末で実行可能なdebugserver
バイナリを用意する
→Universalバイナリをlipo
を使って対象の端末アーキテクチャに合わせました(arm64e)
(解決)debugserver
のバイナリをiPhone端末にCopyして、コマンドでアクセスできるようにする
→こちらはiSH Shell
のFile Brawsing機能とiPhoneの「File」アプリで解決しました。
(★未解決)用意したコマンド実行環境からiPhone端末で実行中のプロセスにアクセスする
→これが解決できないとそもそもデバッグ対象のプロセスにlldbからAttachができないので、どうしようもなかったです。
(jailbreakをすればroot権限の問題やアクセス範囲の課題も解決できます)
まとめ
lldbを利用したリモードデバッグはiPhone端末ではjailbreakなしでは難しいです。
ただMac-to-Macでのリモートデバッグは可能ですので興味のある方はチャレンジしてみてください。