mcpField
A
axiom-lldb-ref

axiom-lldb-ref

github.com/charleswiltgen開発1.2k107 回インストール今日更新
リポジトリ

axiom-lldb-ref について

axiom-lldb-ref は、XcodeのLLDBコマンドを作業別にまとめたリファレンスです。デバッグ手順ではなくコマンドを調べたい開発者向けで、変数、ブレークポイント、スレッド、式、プロセス、メモリ、トラブルシューティングを扱います。

主な機能

  1. 01変数確認コマンドを掲載
  2. 02ブレークポイントとウォッチポイント操作を網羅
  3. 03スレッドとバックトレースの移動方法
  4. 04SwiftとObjective-Cの式を説明
  5. 05プロセス、メモリ、イメージのコマンドを記載
  6. 06LLDBのトラブルシューティングを案内

活用シーン

  1. 01Xcodeでデバッグ中にLLDB構文を確認
  2. 02ブレークポイントやウォッチポイントを設定・管理
  3. 03スレッド、メモリ、ロード済みモジュールを調査
  4. 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 objcObjective-C として評価します
-l swiftSwift として評価します(デフォルト)
-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 の式パーサーが現在のモジュールから型を解決できません。

対処方法:

  1. 代わりに v を使います(コンパイルは不要です)
  2. 式をシンプルにします
  3. Objective-C ブリッジ型には expr -l objc -- ... を試します
  4. Derived Data をクリーンアップして、再ビルドします
「variable not available」

原因: コンパイラーによって変数が最適化で取り除かれました。

対処方法:

  1. Debug ビルド構成に切り替えます
  2. 対象ファイルに -Onone を設定します(Build Settings → ファイルごとのコンパイラーフラグ)
  3. register read を使って、値がレジスターにあるか確認します
「wrong language mode」

原因: LLDB は一部のコンテキスト(特にフレームワーク内)で、デフォルトで Objective-C を使用します。

対処方法:

(lldb) settings set target.language swift
(lldb) expr -l swift -- mySwiftExpression
「expression caused a crash」

原因: 評価した式に副作用があり、クラッシュしました。

対処方法:

  1. 意図がない限り、状態を変更する式を評価しないでください
  2. 読み取り専用の確認には v を使います
  3. クラッシュによって状態が破損した場合は、デバッグセッションを再起動します
LLDB がハングする、または遅い

原因: 通常は、複雑な式のコンパイル中、または大規模なプロジェクトで型を解決中です。

対処方法:

  1. p/po の代わりに v を使います(コンパイルは不要です)
  2. 式を簡潔にします
  3. 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

コメント