axiom-lldb-ref について
axiom-lldb-ref は、XcodeのLLDBコマンドを作業別にまとめたリファレンスです。デバッグ手順ではなくコマンドを調べたい開発者向けで、変数、ブレークポイント、スレッド、式、プロセス、メモリ、トラブルシューティングを扱います。
主な機能
- 01変数確認コマンドを掲載
- 02ブレークポイントとウォッチポイント操作を網羅
- 03スレッドとバックトレースの移動方法
- 04SwiftとObjective-Cの式を説明
- 05プロセス、メモリ、イメージのコマンドを記載
- 06LLDBのトラブルシューティングを案内
活用シーン
- 01Xcodeでデバッグ中にLLDB構文を確認
- 02ブレークポイントやウォッチポイントを設定・管理
- 03スレッド、メモリ、ロード済みモジュールを調査
- 04式やブレークポイントの一般的な問題を解決
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ charleswiltgen/ axiom --skill axiom-lldb-refインストール後、Claude Code で/axiom-lldb-refを入力して読み込まれたか確認します。
詳細
LLDB コマンドリファレンス
Xcode の LLDB コマンドを網羅したリファレンスです。作業別に整理されているため、必要なコマンドをすぐに見つけられます。
デバッグのワークフローと判断ツリーについては、/skill axiom-lldb を参照してください。
パート 1:変数の調査
v / frame variable
メモリを直接読み取ります。コンパイルは行いません。Swift の値を調べる場合に最も信頼性の高い方法です。
(lldb) v # All variables in current frame
(lldb) v self # Self in current context
(lldb) v self.propertyName # Specific property
(lldb) v localVariable # Local variable
(lldb) v self.array[0] # Collection element
(lldb) v self._showDetails # SwiftUI @State backing store (underscore prefix)
フラグ:
| フラグ | 効果 |
|---|---|
-d run | 動的型解決を実行します(速度は低下しますが、精度が上がります) |
-T | 型を表示します |
-R | 生の(フォーマットされていない)出力を表示します |
-D N | ネストされた型の深さを N レベルに制限します |
-P N | ポインターの深さを N レベルに制限します |
-F | フラットな出力にします(階層なし) |
制限事項: 式、計算プロパティ、関数呼び出しは評価できません。それらには p を使用してください。
p / expression(フォーマット付き)
式をコンパイルして実行し、フォーマットされた結果を表示します。
(lldb) p self.computedProperty
(lldb) p items.count
(lldb) p someFunction()
(lldb) p String(describing: someValue)
(lldb) p (1...10).map { $0 * 2 }
結果は番号付きの変数に保存されます。
(lldb) p someValue
$R0 = 42
(lldb) p $R0 + 10
$R1 = 52
po / expression --object-description
結果に対して debugDescription(または description)を呼び出します。
(lldb) po myObject
(lldb) po error
(lldb) po notification.userInfo
(lldb) po NSHomeDirectory()
po が役立つ場合: CustomDebugStringConvertible に準拠するクラス、NSError、NSNotification、オブジェクトのコレクション。
po が失敗する場合: CustomDebugStringConvertible に準拠しない Swift 構造体、プロトコル型の値(代わりに v を使用してください。v は po ではできない反復的な動的型解決を実行します)。
expression(完全形式)
すべてのオプションを指定した完全な式評価です。
(lldb) expression self.view.backgroundColor = UIColor.red
(lldb) expression self.debugFlag = true
(lldb) expression myArray.append("test")
(lldb) expression CATransaction.flush() # Force UI update
(lldb) expression Self._printChanges() # SwiftUI debug
フラグ:
| フラグ | 効果 |
|---|---|
-l objc | Objective-C として評価します |
-l swift | Swift として評価します(デフォルト) |
-O | オブジェクトの説明(po と同じ) |
-i false | 評価中にヒットしたブレークポイントで停止します(デフォルト:無視) |
-- | フラグと式の区切り |
Swift のデバッグに使う Objective-C の式:
(lldb) expr -l objc -- (void)[[[UIApplication sharedApplication] keyWindow] recursiveDescription]
(lldb) expr -l objc -- (void)[CATransaction flush]
(lldb) expr -l objc -- (int)[[UIApplication sharedApplication] _isForeground]
register read
低レベルのレジスター調査:
(lldb) register read
(lldb) register read x0 x1 # Specific registers (ARM64)
(lldb) register read --all # All register sets
パート 2:ブレークポイント
ブレークポイントの設定
(lldb) breakpoint set -f File.swift -l 42 # File + line
(lldb) b File.swift:42 # Short form
(lldb) breakpoint set -n methodName # By function name
(lldb) breakpoint set -n "MyClass.myMethod" # Qualified name
(lldb) breakpoint set -S layoutSubviews # ObjC selector
(lldb) breakpoint set -r "viewDid.*" # Regex on name
(lldb) breakpoint set -a 0x100abc123 # Memory address
条件付きブレークポイント
(lldb) breakpoint set -f File.swift -l 42 -c "value == nil"
(lldb) breakpoint set -f File.swift -l 42 -c "index > 100"
(lldb) breakpoint set -f File.swift -l 42 -c 'name == "test"'
無視する回数
(lldb) breakpoint set -f File.swift -l 42 -i 50 # Skip first 50 hits
1 回限りのブレークポイント
(lldb) breakpoint set -f File.swift -l 42 -o # Delete after first hit
ブレークポイントコマンド(ログポイント)
ブレークポイントにヒットしたときに実行するコマンドを追加します。
(lldb) breakpoint command add 1
> v self.state
> p self.items.count
> continue
> DONE
または、1 行で指定します。
(lldb) breakpoint command add 1 -o "v self.state"
例外ブレークポイント
(lldb) breakpoint set -E swift # All Swift errors
(lldb) breakpoint set -E objc # All ObjC exceptions
# Filtering by exception name requires Xcode's GUI (Edit Breakpoint → Exception field)
シンボリックブレークポイント
(lldb) breakpoint set -n UIViewAlertForUnsatisfiableConstraints # Auto Layout
(lldb) breakpoint set -n "-[UIApplication _run]" # App launch
(lldb) breakpoint set -n swift_willThrow # Swift throw
ブレークポイントの管理
(lldb) breakpoint list # List all
(lldb) breakpoint list -b # Brief format
(lldb) breakpoint enable 3 # Enable breakpoint 3
(lldb) breakpoint disable 3 # Disable breakpoint 3
(lldb) breakpoint delete 3 # Delete breakpoint 3
(lldb) breakpoint delete # Delete ALL (asks confirmation)
(lldb) breakpoint modify 3 -c "x > 10" # Add condition to existing
ウォッチポイント
変数のメモリが変更されたときに停止します。
(lldb) watchpoint set variable self.count # Watch for write
(lldb) watchpoint set variable -w read_write myGlobal # Watch for read or write
(lldb) watchpoint set expression -- &myVariable # Watch memory address
(lldb) watchpoint list # List all
(lldb) watchpoint delete 1 # Delete watchpoint 1
(lldb) watchpoint modify 1 -c "self.count > 10" # Add condition
注: ハードウェアウォッチポイントはプロセスあたり約 4 個に制限されています。必要な場合に限って使用してください。
パート 3:スレッドとバックトレース
バックトレース
(lldb) bt # Current thread backtrace
(lldb) bt 10 # Limit to 10 frames
(lldb) bt all # All threads
(lldb) thread backtrace all # Same as bt all
スレッドの移動
(lldb) thread list # List all threads with state
(lldb) thread info # Current thread details + stop reason
(lldb) thread select 3 # Switch to thread 3
フレームの移動
(lldb) frame info # Current frame details
(lldb) frame select 5 # Jump to frame 5
(lldb) up # Go up one frame (toward caller)
(lldb) down # Shortcut: go down one frame
スレッドの戻り(コードのスキップ)
現在の関数から強制的に早期リターンします。
(lldb) thread return # Return void
(lldb) thread return 42 # Return specific value
注意して使用してください — クリーンアップコードをスキップするため、状態が不整合になることがあります。
パート 4:式の評価
Swift の式
(lldb) expr let x = 42; print(x)
(lldb) expr self.view.backgroundColor = UIColor.red
(lldb) expr UIApplication.shared.windows.first?.rootViewController
(lldb) expr UserDefaults.standard.set(true, forKey: "debug")
Objective-C の式
Swift の式パーサーで失敗した場合は、ObjC に切り替えます。
(lldb) expr -l objc -- (void)[CATransaction flush]
(lldb) expr -l objc -- (id)[[UIApplication sharedApplication] keyWindow]
(lldb) expr -l objc -- (void)[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:nil]
UI デバッグ用の式
(lldb) expr -l objc -- (void)[[[UIApplication sharedApplication] keyWindow] recursiveDescription]
(lldb) po UIApplication.shared.windows.first?.rootViewController?.view.recursiveDescription()
SwiftUI のデバッグ
(lldb) expr Self._printChanges() # Print what triggered body re-eval (inside view body only)
ランタイム型情報
(lldb) expr type(of: someValue)
(lldb) expr String(describing: type(of: someValue))
パート 5:プロセス制御
実行制御
(lldb) continue # Resume execution (c)
(lldb) c # Short form
(lldb) process interrupt # Pause running process
(lldb) thread step-over # Step over (n / next)
(lldb) n # Short form
(lldb) thread step-in # Step into (s / step)
(lldb) s # Short form
(lldb) thread step-out # Step out (finish)
(lldb) finish # Short form
(lldb) thread step-inst # Step one instruction (assembly-level)
(lldb) ni # Step over one instruction
プロセス管理
(lldb) process launch # Launch/restart
(lldb) process attach --pid 1234 # Attach to running process
(lldb) process attach --name MyApp # Attach by name
(lldb) process detach # Detach without killing
(lldb) kill # Kill debugged process
パート 6:メモリとイメージ
メモリの読み取り
(lldb) memory read 0x100abc123 # Read memory at address
(lldb) memory read -c 64 0x100abc123 # Read 64 bytes
(lldb) memory read -f x 0x100abc123 # Format as hex
(lldb) memory read -f s 0x100abc123 # Format as string
メモリ検索
(lldb) memory find -s "searchString" -- 0x100000000 0x200000000
イメージ/モジュールの調査
(lldb) image lookup -a 0x100abc123 # Lookup symbol at address
(lldb) image lookup -n myFunction # Find function by name
(lldb) image lookup -rn "MyClass.*" # Regex search
(lldb) image list # List all loaded images/frameworks
(lldb) image list -b # Brief format
よくある用途: クラッシュアドレスがどのフレームワークに属するかを特定します。
(lldb) image lookup -a 0x1a2b3c4d5
パート 7:.lldbinit とカスタマイズ
ファイルの場所
LLDB は起動時に ~/.lldbinit を読み込みます。Xcode のスキーム設定で構成すれば、プロジェクトごとの初期化ファイルも使用できます。
便利なエイリアス
~/.lldbinit に追加します。
# Quick reload — flush UI changes made via expression
command alias flush expr -l objc -- (void)[CATransaction flush]
# Print view hierarchy
command alias views expr -l objc -- (void)[[[UIApplication sharedApplication] keyWindow] recursiveDescription]
# Print auto layout constraints
command alias constraints po [[UIWindow keyWindow] _autolayoutTrace]
カスタム型サマリー
# Show CLLocationCoordinate2D as "lat, lon"
type summary add CLLocationCoordinate2D --summary-string "${var.latitude}, ${var.longitude}"
設定
(lldb) settings show target.language # Current language
(lldb) settings set target.language swift # Force Swift mode
(lldb) settings set target.max-children-count 100 # Show more collection items
プロジェクトごとの .lldbinit
Xcode で、スキームを編集 → 実行 → オプション →「LLDB Init File」フィールドを選択します。
プロジェクト固有のエイリアスとブレークポイントは、プロジェクトのルートにある .lldbinit ファイルに記述します。
パート 8:LLDB 自体のトラブルシューティング
「expression failed to parse」
原因: Swift の式パーサーが現在のモジュールから型を解決できません。
対処方法:
- 代わりに
vを使います(コンパイルは不要です) - 式をシンプルにします
- Objective-C ブリッジ型には
expr -l objc -- ...を試します - Derived Data をクリーンアップして、再ビルドします
「variable not available」
原因: コンパイラーによって変数が最適化で取り除かれました。
対処方法:
- Debug ビルド構成に切り替えます
- 対象ファイルに
-Ononeを設定します(Build Settings → ファイルごとのコンパイラーフラグ) register readを使って、値がレジスターにあるか確認します
「wrong language mode」
原因: LLDB は一部のコンテキスト(特にフレームワーク内)で、デフォルトで Objective-C を使用します。
対処方法:
(lldb) settings set target.language swift
(lldb) expr -l swift -- mySwiftExpression
「expression caused a crash」
原因: 評価した式に副作用があり、クラッシュしました。
対処方法:
- 意図がない限り、状態を変更する式を評価しないでください
- 読み取り専用の確認には
vを使います - クラッシュによって状態が破損した場合は、デバッグセッションを再起動します
LLDB がハングする、または遅い
原因: 通常は、複雑な式のコンパイル中、または大規模なプロジェクトで型を解決中です。
対処方法:
p/poの代わりにvを使います(コンパイルは不要です)- 式を簡潔にします
poの実行中に LLDB がハングした場合は、Ctrl+C でキャンセルし、代わりにvを使います
ブレークポイントに到達しない
原因と対処方法:
| 原因 | 対処方法 |
|---|---|
| ファイル/行が違う(コードが移動した) | 現在のコードにブレークポイントを設定し直します |
| ブレークポイントが無効 | breakpoint enable N |
| コードが実行されていない | コードパスに到達していることを確認します |
| 最適化で取り除かれた(Release) | Debug 構成に切り替えます |
| フレームワーク/SPM パッケージ内にある | 関数名でシンボリックブレークポイントを設定します |
リソース
WWDC:2019-429、2018-412、2022-110370、2015-402
ドキュメント:/xcode/stepping-through-code-and-inspecting-variables-to-isolate-bugs、/xcode/setting-breakpoints-to-pause-your-running-app
スキル:axiom-lldb、axiom-xcode-debugging