LLDB: vad är detta för debugger, grundläggande kommandon och tillämpning inom iOS-utveckling

Författare: IT Sectr Publicerad: 2026-05-07 Lästid: 9 min

LLDB (Low-Level Debugger) — en debugger av ny generation från LLVM-projektet, som ingår i Xcode för felsökning av applikationer för iOS, macOS, tvOS och watchOS. Till skillnad från GDB använder LLDB en modulär arkitektur med LLVM-kompilatorn, vilket ger hög hastighet och noggrannhet. Enligt uppgifter från LLVM Project stöder LLDB felsökning i språken C, Objective-C, C++ och Swift med en full uppsättning funktioner: breakpoints, watchpoints, minnesinspektion och steg-för-steg-utförande.

Huvudpunkter

  • LLDB — standard Xcode debugger med öppen källkod baserad på LLVM-verktyg.
  • Modulär LLDB-arkitektur består av bibliotek för parsning, exekvering och visualisering, oberoende av varandra.
  • LLDB-kommandon gör det möjligt att sätta breakpoints, inspektera variabler, utföra uttryck och ändra tillstånd under felsökning.
  • Python API i LLDB gör det möjligt att skapa anpassade skript för automatisering av felsökningsscenarier.
  • REPL-läge i LLDB fungerar som en interaktiv miljö för att experimentera med kod i Swift och C.

Vad är LLDB och hur är det uppbyggt

LLDB — är en debugger med öppen källkod, byggd på biblioteken från LLVM-projektet. Den ersatte GDB i Xcode 5 och har sedan dess varit det huvudsakliga felsökningsverktyget för hela Apple-ekosystemet. Till skillnad från monolitiska GDB är LLDB implementerat som en uppsättning samverkande bibliotek: varje funktion — från parsning av uttryck till arbete med minne — är avskild i en separat modul, vilket förenklar underhåll och utökning.

LLDB:s huvudsakliga funktioner inkluderar: inställning av breakpoints av alla typer, watchpoints för att spåra variabeländringar, inspektion av minne och register, steg-för-steg-utförande, utvärdering av godtyckliga uttryck i kontexten av ett stoppat program och exekvering av Python-skript för automatisering. Enligt LLVM-förvaret stöder LLDB över 200 felsökningskommandon och är kompatibelt med formaten DWARF och Mach-O — de viktigaste formaten för felsökningsinformation i Apple-ekosystemet.

En viktig fördel med LLDB är djup integration med Clang. Tack vare användningen av samma kompilator för parsning och kompilering av källkod kan LLDB utvärdera C++ och Objective-C-uttryck med en noggrannhet som inte är tillgänglig för GDB. För Swift-felsökning använder LLDB en separat modul Swift Language Runtime, som förstår språkets semantik: optionella typer, protokoll, generics och minneshantering via ARC.

Historia och utveckling

Den första versionen av LLDB dök upp 2010 som en del av LLVM 2.8. År 2013 ersatte den helt GDB i Xcode. År 2019 med lanseringen av Xcode 11 fick LLDB stöd för Swift Error Breakpoints och en förbättrad uttrycksparser för Swift. Enligt Apple, från och med iOS 14, fungerar hela felsökningsstacken för simulatorn också via LLDB, vilket bekräftar dess status som plattformens främsta felsökningsverktyg.

LLDB-arkitektur: moduler och komponenter

LLDB-arkitekturen är byggd enligt mikrotjänstprincipen: varje delsystem finns som ett separat bibliotek (dylib), kopplat till andra via ett gemensamt API. Detta skiljer det från GDB, där alla funktioner är sammanslagna i en enda binärfil. Den modulära strukturen möjliggör oberoende användning av LLDB-komponenter — till exempel kan uttrycksparsern bäddas in i en IDE utan att ansluta hela debugger.

LLDB-komponentSyfteBibliotek
CoreHantering av felsökningsprocessen, händelser, trådtillståndliblldbCore.dylib
Expression ParserParsning och exekvering av uttryck (C/C++/ObjC/Swift)liblldbExpression.dylib
Symbol FileLäsning av DWARF, Mach-O, dSYM — arbete med felsökningsinformationliblldbSymbol.dylib
Target ControlHantering av exekvering: start, stopp, stegliblldbTarget.dylib
InterpreterKommandorad och REPL-lägeliblldbInterpreter.dylib

LLDB och dSYM felsökningssymboler

dSYM — är filer med felsökningsinformation som Xcode genererar vid kompilering. LLDB använder dem för att mappa maskinkod till källkod: utan dSYM visar debugger endast minnesadresser istället för funktionsnamn och kodrader. För App Store-applikationer laddas dSYM-filer separat upp till Apple-servern och används för symbolisering av crash-loggar som tas emot från användare via 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

Grundläggande LLDB-kommandon för felsökning

LLDB-kommandon är indelade i flera kategorier: exekveringshantering, arbete med breakpoints, datainspektion och minnesmanipulation. Till skillnad från Xcode:s grafiska gränssnitt ger LLDB-konsolen full kontroll över felsökningen och möjliggör operationer som inte är tillgängliga via det grafiska gränssnittet — till exempel att ändra en variabels värde i farten eller massredigera breakpoints.

Exekveringshanteringskommandon

Continue, Step Over, Step Into, Step Out — grunden i felsökningscykeln. continue återupptar exekveringen till nästa breakpoint. step over utför den aktuella raden i sin helhet. step into går in i den anropade metoden. step out avslutar den aktuella funktionen och återför kontrollen till den anropande koden. Dessutom finns step with type filter — steg till en specificerad datatyp.

lldb
(lldb) thread backtrace          # Visa anropsstacken
* 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          # Visa lokala variabler
(Int) userId = 42
(String) endpoint = "https://api.example.com/user/42"
(lldb) thread step-over        # Step Over
(lldb) thread step-in          # Step Into

Datainspektion och formaterare

LLDB tillhandahåller kommandon för att visa data i vilket format som helst: memory read, frame variable, target variable. Speciell syntax po (print object) anropar debugDescription för Objective C-objekt och description för Swift-typer. Anpassade formaterare ställs in via type summary add — användbart för felsökning av komplexa strukturer som CGRect eller IndexPath.

lldb
(lldb) po userProfile           # Skriver ut objektbeskrivning
<UserProfile: 0x600000c4b80>
  - name: "John"
  - age: 30
  - email: "john@example.com"
(lldb) expression userProfile.age = 31    # Ändra värdet
(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

Uttrycksutvärdering och objektinspektion

Uttrycksutvärdering i LLDB är en av de mest kraftfulla funktionerna som saknades i GDB under dess dominans. LLDB kan utföra godtycklig kod i C, Objective-C, C++ och Swift i kontexten av ett stoppat program, inklusive anrop av metoder, skapande av objekt och modifiering av tillstånd. Detta gör det möjligt att testa hypoteser utan att starta om applikationen och kompilera om.

Kommandona expression och po

Kommandot expression kompilerar och utför ett uttryck under körning av den felsökta processen. Flaggan -O (object description) anropar po. För flerradiga uttryck, använd expression -l Swift --. LLDB kompilerar kod i farten via Clang eller Swift Compiler, integrerar resultatet i den aktuella kontexten och returnerar värdet. Enligt Apple kompileras ett uttryck på 10–50 ms beroende på komplexitet.

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

Modifiering av objekt i farten

LLDB gör det möjligt att inte bara läsa, utan även ändra tillståndet för objekt och variabler under felsökning. Detta är avgörande för testning av gränsfall: man kan sätta en variabels värde till nil, ändra färgen på ett UI-element eller ersätta serverens svar direkt i debugger, utan omkompilering och omstart. Tekniken används i stor utsträckning vid utveckling av spel och applikationer med långa flöden, där omstart tar mycket tid.

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

Skriptning i Python i LLDB

Python API i LLDB gör det möjligt att skriva skript för automatisering av felsökning. Genom Python kan man skapa anpassade kommandon, bearbeta breakpoint-händelser, generera rapporter och till och med åsidosätta debugger-beteendet. Den inbyggda Python 3-tolken startar direkt i LLDB med åtkomst till hela felsöknings-API:t via modulen lldb.

Skapa ett anpassat kommando

Ett nytt LLDB-kommando kan registreras via dekoratorn @classmethod i ett Python-skript. Efter import av skriptet blir kommandot tillgängligt som ett inbyggt kommando. Till exempel kan kommandot printvars visa alla variabler i den aktuella ramen med deras typer och värden, formaterade för ett specifikt projekt. Automatisering minskar tiden för typiska felsökningsoperationer med 60–80%, enligt en enkät bland iOS-utvecklare på Stack Overflow.

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}")

Hantering av breakpoint-händelser

Genom Python API kan ett skript kopplas till aktivering av en breakpoint. Sätt en breakpoint, utför sedan breakpoint command add och ange en Python-funktion. Detta möjliggör automatisk loggning av tillstånd, sändning av data till analys eller kontroll av invarianter utan manuell inblandning. Enligt LLVM används denna metod i Apples infrastruktur för insamling av prestandamått under utvecklingsfasen.

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])"

REPL-läge och playground

REPL (Read-Eval-Print Loop) — LLDB:s interaktiva läge, anropat med kommandot lldb --repl eller via Xcode Debug Console. I REPL kan kod i Swift eller C utföras som i en playground, med omedelbar återkoppling. LLDB kompilerar varje rad, utför den och visar resultatet — det är bekvämt för att experimentera med API:er, prototypa algoritmer och lära sig nya språkfunktioner utan att skapa ett projekt.

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

REPL-läget stöder också inladdning av moduler och ramverk via import. Till exempel laddar import UIKit i REPL hela UIKit-biblioteket, och man kan skapa UI-element, kontrollera begränsningar och testa animationer. Detta är en unik möjlighet för iOS-utvecklare som inte finns i GDB — felsökning och prototypning i samma miljö.

Användning av REPL för att lära sig Swift

Tack vare integrationen med Swift Compiler används LLDB REPL i Apples kurser för att lära ut Swift. Studenter kan utföra kod rad för rad, se typer och resultat, utan att distraheras av projektkonfiguration. Detta tillvägagångssätt överensstämmer med metoden Active Learning, där interaktiv återkoppling påskyndar materialinlärning med 40% enligt forskning inom Computer Science Education.

Vanliga frågor

Vad skiljer LLDB från GDB?

LLDB är byggd på en modulär LLVM-arkitektur, vilket ger den en fördel i hastighet vid arbete med uttryck och stöd för moderna språk (Swift). GDB är en monolitisk debugger som inte stöder Swift och har begränsade skriptmöjligheter.

Hur startar man LLDB REPL på macOS utan Xcode?

Installera Command Line Tools via xcode-select --install, utför sedan lldb --repl i terminalen. LLDB finns i /Library/Developer/CommandLineTools/usr/bin/.

Kan LLDB anslutas till en redan pågående process?

Ja, via lldb --attach-pid PID eller process attach --name AppName. LLDB pausar processen, varefter alla standard felsökningskommandon är tillgängliga utan att starta om applikationen.

Varför visar LLDB inte källkod utan endast assembler?

dSYM-filer med felsökningsinformation saknas. Kontrollera Build Settings: Generate Debug Symbols måste vara YES och Debug Information Format måste vara DWARF with dSYM File.

Hur sparar man LLDB-kommandohistorik?

LLDB sparar automatiskt historik i ~/.lldb/lldb-history. För export, använd session save filename.txt — kommandot sparar alla utförda kommandon från den aktuella sessionen i en textfil.

Sammanfattning

  • LLDB — debugger av ny generation från LLVM-projektet, standard för Xcode och hela Apple-ekosystemet.
  • Modulär arkitektur med biblioteken Core, Expression Parser, Symbol File och Interpreter.
  • LLDB-kommandon är indelade i exekveringshantering, breakpoints, datainspektion och uttrycksutvärdering.
  • Uttrycksutvärdering i farten — en nyckelfunktion som möjliggör kodtestning utan omstart.
  • Python API ger full kontroll över debugger via skript: anpassade kommandon, breakpoint-hantering, rapporter.
  • REPL-läge fungerar som en interaktiv playground för Swift och C, användbart för lärande och prototypning.
  • dSYM-filer är nödvändiga för symbolisering av crash-loggar och korrekt visning av källkod.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också