📚
iOSでLLDBデバッグをする方法(脱獄環境必須)
この記事では、
iPhone実機にあるアプリに、MacのLLDBから接続してデバッグする方法を
順を追って解説します。
⚠️ 本記事は 脱獄済みiOS端末 を前提とします
Xcodeを使わないデバッグ方法です
この記事でできるようになること
- iPhone上のアプリに LLDBでアタッチ
- 実行中のアプリの スタックトレース確認
- ブレークポイント・レジスタ・メモリ確認
全体の流れ(最初に把握しよう)
やることは以下の 3ステップだけ です。
- debugserver を用意する
- iPhoneで debugserver を起動する
- MacのLLDBから接続する
必要なもの
Mac側
- macOS
- Xcode または Command Line Tools
ldidlldb
iPhone側
- 脱獄済み iOS
- OpenSSH インストール済み
- Wi-Fi(Macと同一ネットワーク)
① MacからiPhoneへSSH接続する
まずは iPhoneにログインします。
ssh root@iPhone_IP
例:
ssh root@192.168.1.20
② debugserver を用意する(Mac側)
debugserverとは?
debugserver は iOS上で動くLLDBのサーバーです。
MacのLLDBは、これを通してアプリを操作します。
MacにあるものをiOSにコピーして使います。
debugserverの場所
/Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver
このファイルを作業ディレクトリにコピーします。
③ entitlements を付与する
iOSでは、 デバッグに必要な権限(entitlements) を付けないと
debugserverは動きません。
entitlements
debugserver.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.backboardd.debugapplications</key>
<true/>
<key>com.apple.backboardd.launchapplications</key>
<true/>
<key>com.apple.diagnosticd.diagnostic</key>
<true/>
<key>com.apple.frontboard.debugapplications</key>
<true/>
<key>com.apple.frontboard.launchapplications</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>com.apple.system-task-ports</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>platform-application</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>
ldidで置き換え
ldid -Sdebugserver.xml debugserver
④ iPhoneにdebugserverをコピーする
rootless環境の場合
scp debugserver root@iPhone_IP:/var/jb/usr/bin/debugserver
ssh root@iPhone_IP "chmod +x /var/jb/usr/bin/debugserver"
非rootless環境の場合
scp debugserver root@iPhone_IP:/usr/bin/debugserver
ssh root@iPhone_IP "chmod +x /usr/bin/debugserver"
⑤ iPhone側でdebugserverを起動する
SSHで接続したまま、以下を実行します。
debugserver 0.0.0.0:1234 -waitfor Twitter
-
1234:待ち受けポート -
Twitter:アプリ名(Bundle IDでも可) - アプリが起動すると自動でアタッチされます
⑥ Mac側からLLDBで接続する
別のターミナルを開いて:
lldb
LLDB内で以下を実行します。
platform select remote-ios
process connect connect://iPhone_IP:1234
これで iPhone上のアプリと接続完了です 🎉
よく使うLLDBコマンド
bt # スタックトレース
image list # 読み込まれているバイナリ一覧
br set -n main # ブレークポイント
c # 続行
よくあるエラーと対処
debugserverがすぐ落ちる
- entitlements不足
- ldidの
-S指定ミス
接続できない
- iPhoneとMacが同一ネットワークか確認
- ポート番号が一致しているか確認
rootlessで動かない
-
/usr/binではなく/var/jb/usr/binを使う
Discussion