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 — ä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.
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-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-komponent | Syfte | Bibliotek |
|---|---|---|
| Core | Hantering av felsökningsprocessen, händelser, trådtillstånd | liblldbCore.dylib |
| Expression Parser | Parsning och exekvering av uttryck (C/C++/ObjC/Swift) | liblldbExpression.dylib |
| Symbol File | Läsning av DWARF, Mach-O, dSYM — arbete med felsökningsinformation | liblldbSymbol.dylib |
| Target Control | Hantering av exekvering: start, stopp, steg | liblldbTarget.dylib |
| Interpreter | Kommandorad och REPL-läge | liblldbInterpreter.dylib |
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) 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
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.
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) 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
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) 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 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.
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) expr -l Swift -- UIAlertController(title: "Test", message: nil,
preferredStyle: .alert)
(lldb) expr let $arr = [1, 2, 3].map { $0 * 2 }
(lldb) po $arr
▿ 3 elements
- 0 : 2
- 1 : 4
- 2 : 6
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) expr self.label.text = @"Updated"
(lldb) expr -l Swift -- (self as! UIViewController).view.backgroundColor = .red
(lldb) expr let $snapshot = self.view.debugQuickLookObject()
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.
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.
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}")
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) 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 (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) --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ö.
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
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.
Installera Command Line Tools via xcode-select --install, utför sedan lldb --repl i terminalen. LLDB finns i /Library/Developer/CommandLineTools/usr/bin/.
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.
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.
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
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.
Läs också