📚

iOSでLLDBデバッグをする方法(脱獄環境必須)

に公開

この記事では、
iPhone実機にあるアプリに、MacのLLDBから接続してデバッグする方法を
順を追って解説します。

⚠️ 本記事は 脱獄済みiOS端末 を前提とします
Xcodeを使わないデバッグ方法です


この記事でできるようになること

  • iPhone上のアプリに LLDBでアタッチ
  • 実行中のアプリの スタックトレース確認
  • ブレークポイント・レジスタ・メモリ確認

全体の流れ(最初に把握しよう)

やることは以下の 3ステップだけ です。

  1. debugserver を用意する
  2. iPhoneで debugserver を起動する
  3. MacのLLDBから接続する

必要なもの

Mac側

  • macOS
  • Xcode または Command Line Tools
  • ldid
  • lldb

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