LLDB: cos'è questo debugger, comandi principali e utilizzo nello sviluppo iOS

Autore: IT Sectr Pubblicato: 2026-05-07 Tempo di lettura: 9 min

LLDB (Low-Level Debugger) è un debugger di nuova generazione del progetto LLVM, incluso in Xcode per il debug di applicazioni su iOS, macOS, tvOS e watchOS. A differenza di GDB, LLDB utilizza un'architettura modulare con il compilatore LLVM, garantendo alta velocità e precisione. Secondo il Progetto LLVM, LLDB supporta il debug in C, Objective-C, C++ e Swift con una suite completa di funzionalità: breakpoint, watchpoint, ispezione della memoria ed esecuzione passo-passo.

Punti chiave

  • LLDB è il debugger standard di Xcode con codice open source basato sulla toolchain LLVM.
  • L'architettura modulare di LLDB è composta da librerie per parsing, esecuzione e visualizzazione, indipendenti tra loro.
  • I comandi di LLDB consentono di impostare breakpoint, ispezionare variabili, eseguire espressioni e modificare lo stato durante il debug.
  • L'API Python di LLDB permette di creare script personalizzati per automatizzare scenari di debug.
  • La modalità REPL di LLDB funge da ambiente interattivo per sperimentare con codice Swift e C.

Cos'è LLDB e come funziona

LLDB è un debugger open source costruito sulle librerie del progetto LLVM. Ha sostituito GDB in Xcode 5 e da allora è diventato lo strumento di debug principale per l'intero ecosistema Apple. A differenza di GDB monolitico, LLDB è implementato come un insieme di librerie interagenti: ogni funzione — dal parsing delle espressioni alla gestione della memoria — è collocata in un modulo separato, semplificando la manutenzione e l'estensione.

Le capacità principali di LLDB includono: impostazione di breakpoint di qualsiasi tipo, watchpoint per tracciare le modifiche delle variabili, ispezione di memoria e registri, esecuzione passo-passo, valutazione di espressioni arbitrarie nel contesto di un programma fermo ed esecuzione di script Python per l'automazione. Secondo il repository LLVM, LLDB supporta oltre 200 comandi di debug ed è compatibile con i formati DWARF e Mach-O — i principali formati di informazioni di debug nell'ecosistema Apple.

Un vantaggio importante di LLDB è la sua profonda integrazione con Clang. Utilizzando lo stesso compilatore per analizzare e compilare il codice sorgente, LLDB può valutare espressioni C++ e Objective-C con una precisione non disponibile in GDB. Per il debug di Swift, LLDB utilizza un modulo separato Swift Language Runtime che comprende la semantica del linguaggio: tipi opzionali, protocolli, generics e gestione della memoria tramite ARC.

Storia ed evoluzione

La prima versione di LLDB è apparsa nel 2010 come parte di LLVM 2.8. Entro il 2013, aveva completamente sostituito GDB in Xcode. Nel 2019, con il rilascio di Xcode 11, LLDB ha ottenuto il supporto per Swift Error Breakpoints e un parser di espressioni migliorato per Swift. Secondo Apple, da iOS 14, l'intero stack di debug per il simulatore funziona anch'esso tramite LLDB, confermando il suo status di strumento di debug principale della piattaforma.

Architettura di LLDB: moduli e componenti

L'architettura di LLDB è costruita sul principio dei microservizi: ogni sottosistema esiste come libreria separata (dylib), collegata alle altre tramite un'API comune. Questo lo distingue da GDB, dove tutte le funzioni sono combinate in un unico binario. La struttura modulare consente di utilizzare i componenti di LLDB in modo indipendente — ad esempio, il parser di espressioni può essere integrato in un IDE senza collegare il debugger completo.

Componente LLDBScopoLibreria
CoreGestione del processo di debug, eventi, stati dei threadliblldbCore.dylib
Expression ParserParsing ed esecuzione di espressioni (C/C++/ObjC/Swift)liblldbExpression.dylib
Symbol FileLettura di DWARF, Mach-O, dSYM — lavoro con informazioni di debugliblldbSymbol.dylib
Target ControlControllo dell'esecuzione: avvio, arresto, passiliblldbTarget.dylib
InterpreterRiga di comando e modalità REPLliblldbInterpreter.dylib

LLDB e simboli di debug dSYM

dSYM sono file di informazioni di debug che Xcode genera durante la compilazione. LLDB li utilizza per mappare il codice macchina al codice sorgente: senza dSYM, il debugger mostra solo indirizzi di memoria invece di nomi di funzioni e righe di codice. Per le applicazioni dell'App Store, i file dSYM vengono caricati separatamente sul server Apple e utilizzati per simbolizzare i registri di crash ricevuti dagli utenti tramite CrashReporter.

lldb
(lldb) target create MyApp.app
(lldb) image list MyApp
MyApp - "/path/to/MyApp.app/MyApp" (arm64)
(lldb) image lookup -n fetchUserData
Address: MyApp[0x1000a3b40] (MyApp.__TEXT.__text + 12352)
Summary: `ViewController.fetchUserData()` at ViewController.swift:42

Comandi di base di LLDB per il debug

I comandi di LLDB sono divisi in diverse categorie: controllo dell'esecuzione, gestione dei breakpoint, ispezione dei dati e manipolazione della memoria. A differenza dell'interfaccia grafica di Xcode, la console di LLDB offre il controllo totale sul debug e consente operazioni non disponibili tramite l'interfaccia grafica — ad esempio, modificare al volo il valore di una variabile o modificare in massa i breakpoint.

Comandi di controllo dell'esecuzione

Continue, Step Over, Step Into, Step Out — la base del ciclo di debug. continue riprende l'esecuzione fino al prossimo breakpoint. step over esegue la riga corrente per intero. step into entra all'interno del metodo chiamato. step out completa la funzione corrente e restituisce il controllo al codice chiamante. Inoltre, esiste step with type filter — passo fino al tipo di dati specificato.

lldb
(lldb) thread backtrace          # Mostrare lo stack delle chiamate
* thread #1, queue = 'com.apple.main-thread'
    frame #0: 0x1000a3b40 ViewController`fetchUserData()
    frame #1: 0x1000a2000 ViewController`viewDidLoad()
    frame #2: 0x1a2b345 UIKit`UIViewController.loadView()
(lldb) frame variable          # Mostrare le variabili locali
(Int) userId = 42
(String) endpoint = "https://api.example.com/user/42"
(lldb) thread step-over        # Step Over
(lldb) thread step-in          # Step Into

Ispezione dei dati e formattatori

LLDB fornisce comandi per visualizzare i dati in qualsiasi formato: memory read, frame variable, target variable. La sintassi speciale po (print object) chiama debugDescription sugli oggetti Objective-C e description sui tipi Swift. I formattatori personalizzati vengono impostati tramite type summary add — utile per il debug di strutture complesse come CGRect o IndexPath.

lldb
(lldb) po userProfile           # Stampare la descrizione dell'oggetto
<UserProfile: 0x600000c4b80>
  - name: "John"
  - age: 30
  - email: "john@example.com"
(lldb) expression userProfile.age = 31    # Modificare il valore
(Int) $R0 = 31
(lldb) memory read 0x600000c4b80 0x600000c4bc0
0x600000c4b80: 6a 6f 68 6e 00 00 00 00 1e 00 00 00 00 00 00 00

Valutazione di espressioni e ispezione di oggetti

La valutazione di espressioni in LLDB è una delle funzionalità più potenti, assente in GDB all'epoca del suo dominio. LLDB può eseguire codice arbitrario in C, Objective-C, C++ e Swift nel contesto di un programma fermo, inclusa la chiamata di metodi, la creazione di oggetti e la modifica dello stato. Ciò consente di testare ipotesi senza riavviare l'applicazione e ricompilare.

I comandi expression e po

Il comando expression compila ed esegue un'espressione in fase di esecuzione del processo sottoposto a debug. Il flag -O (object description) attiva po. Per espressioni su più righe, utilizzare expression -l Swift --. LLDB compila il codice al volo tramite Clang o il compilatore Swift, integra il risultato nel contesto corrente e restituisce il valore. Secondo Apple, un'espressione viene compilata in 10–50 ms a seconda della complessità.

lldb
(lldb) expr -l Swift -- UIAlertController(title: "Test", message: nil,
  preferredStyle: .alert)
(lldb) expr let $arr = [1, 2, 3].map { $0 * 2 }
(lldb) po $arr3 elements
  - 0 : 2
  - 1 : 4
  - 2 : 6

Modifica di oggetti al volo

LLDB consente non solo di leggere, ma anche di modificare lo stato di oggetti e variabili durante il debug. Questo è fondamentale per testare i casi limite: è possibile impostare una variabile a nil, cambiare il colore di un elemento dell'interfaccia o sostituire una risposta del server direttamente nel debugger, senza ricompilare e riavviare. Questa tecnica è ampiamente utilizzata nello sviluppo di giochi e applicazioni con flussi lunghi, dove il riavvio richiede molto tempo.

lldb
(lldb) expr self.label.text = @"Updated"
(lldb) expr -l Swift -- (self as! UIViewController).view.backgroundColor = .red
(lldb) expr let $snapshot = self.view.debugQuickLookObject()

Scripting Python in LLDB

L'API Python in LLDB consente di scrivere script per automatizzare il debug. Tramite Python, è possibile creare comandi personalizzati, gestire eventi di breakpoint, generare report e persino sovrascrivere il comportamento del debugger. L'interprete Python 3 integrato viene eseguito direttamente all'interno di LLDB, con accesso all'API completa di debug tramite il modulo lldb.

Creazione di un comando personalizzato

Un nuovo comando LLDB può essere registrato tramite il decoratore @classmethod in uno script Python. Dopo aver importato lo script, il comando diventa disponibile come un comando integrato. Ad esempio, il comando printvars può visualizzare tutte le variabili del frame corrente con i loro tipi e valori, formattati per un progetto specifico. Secondo un sondaggio tra sviluppatori iOS su Stack Overflow, l'automazione riduce il tempo delle operazioni di debug tipiche del 60–80%.

python
import lldb

class PrintVarsCommand:
    @classmethod
    def register_class(cls, debugger, _):
        handler = PrintVarsCommand()
        debugger.HandleCommand('command script add -c \
            print_vars.PrintVarsCommand printvars')

    def __call__(self, debugger, command, exe_ctx, result):
        frame = exe_ctx.frame
        for var in frame.variables:
            result.AppendMessage(f"{var.name}: {var.type} = {var.value}")

Gestione degli eventi di breakpoint

Tramite l'API Python, è possibile associare uno script all'attivazione di un breakpoint. Impostare un breakpoint, quindi eseguire breakpoint command add e specificare una funzione Python. Ciò consente di registrare automaticamente lo stato, inviare dati alle analisi o verificare invarianti senza intervento manuale. Secondo LLVM, questo approccio viene utilizzato nell'infrastruttura di Apple per raccogliere metriche di prestazioni durante lo sviluppo.

lldb
(lldb) breakpoint set -f Model.swift -l 100
(lldb) breakpoint command add 1 -s python -o "frame = exe_ctx.frame;
  print([var.name for var in frame.variables])"

Modalità REPL e playground

REPL (Read-Eval-Print Loop) è una modalità interattiva di LLDB, richiamata con il comando lldb --repl o tramite la console di debug di Xcode. In REPL, è possibile eseguire codice Swift o C come in un playground, con feedback immediato. LLDB compila ogni riga, la esegue e mostra il risultato — comodo per sperimentare con API, prototipare algoritmi e imparare nuove funzionalità del linguaggio senza creare un progetto.

lldb
(lldb) --repl
1> let numbers = [1, 2, 3, 4, 5]
2> numbers.filter { $0 % 2 == 0 }
$R0: [Int] = 2 values {
  [0] = 2
  [1] = 4
}
3> let result = numbers.reduce(0, +)
$R1: Int = 15

La modalità REPL supporta anche il caricamento di moduli e framework tramite import. Ad esempio, import UIKit in REPL carica l'intera libreria UIKit, consentendo di creare elementi dell'interfaccia, verificare constraint e testare animazioni. Questa è una capacità unica per gli sviluppatori iOS, non disponibile in GDB: debug e prototipazione nello stesso ambiente.

Utilizzo di REPL per imparare Swift

Grazie all'integrazione con il compilatore Swift, LLDB REPL viene utilizzato nei corsi Apple per insegnare Swift. Gli studenti possono eseguire il codice riga per riga, vedere tipi e risultati senza distrarsi con la configurazione del progetto. Questo approccio segue la metodologia dell'Apprendimento Attivo, dove il feedback interattivo accelera la comprensione del materiale del 40% secondo la ricerca in Educazione all'Informatica.

Domande frequenti

In cosa si differenzia LLDB da GDB?

LLDB è costruito su un'architettura LLVM modulare, che gli conferisce un vantaggio nella velocità di valutazione delle espressioni e nel supporto di linguaggi moderni (Swift). GDB è un debugger monolitico che non supporta Swift e ha capacità di scripting limitate.

Come eseguire LLDB REPL su macOS senza Xcode?

Installa Command Line Tools tramite xcode-select --install, quindi esegui lldb --repl nel terminale. LLDB è disponibile in /Library/Developer/CommandLineTools/usr/bin/.

È possibile collegare LLDB a un processo già in esecuzione?

Sì, tramite lldb --attach-pid PID o process attach --name AppName. LLDB metterà in pausa il processo, dopodiché tutti i comandi di debug standard sono disponibili senza riavviare l'applicazione.

Perché LLDB mostra assembly invece del codice sorgente?

Mancano i file di informazioni di debug dSYM. Controlla le impostazioni di Build Settings: Generate Debug Symbols deve essere YES e Debug Information Format deve essere DWARF with dSYM File.

Come salvare la cronologia dei comandi di LLDB?

LLDB salva automaticamente la cronologia in ~/.lldb/lldb-history. Per esportare, usa session save filename.txt — il comando salva tutti i comandi eseguiti della sessione corrente in un file di testo.

Riepilogo

  • LLDB è un debugger di nuova generazione del progetto LLVM, standard per Xcode e l'intero ecosistema Apple.
  • Architettura modulare con le librerie Core, Expression Parser, Symbol File e Interpreter.
  • I comandi di LLDB sono suddivisi in controllo dell'esecuzione, breakpoint, ispezione dei dati e valutazione di espressioni.
  • La valutazione di espressioni al volo è una capacità chiave che consente di testare il codice senza riavviare.
  • L'API Python fornisce il controllo completo del debugger tramite script: comandi personalizzati, gestione dei breakpoint, report.
  • La modalità REPL funge da playground interattivo per Swift e C, utile per imparare e fare prototipi.
  • I file dSYM sono necessari per simbolizzare i log di crash e visualizzare correttamente il codice sorgente.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche