LLDB (Low-Level Debugger) — debugger generasi baru dari proyek LLVM, yang merupakan bagian dari Xcode untuk debugging aplikasi iOS, macOS, tvOS, dan watchOS. Berbeda dengan GDB, LLDB menggunakan arsitektur modular dengan kompiler LLVM, yang memberikan kecepatan dan akurasi tinggi. Menurut data LLVM Project, LLDB mendukung debugging dalam bahasa C, Objective-C, C++, dan Swift dengan rangkaian fungsi lengkap: breakpoints, watchpoints, inspeksi memori, dan eksekusi langkah demi langkah.
Poin Utama
LLDB — adalah debugger sumber terbuka yang dibangun di atas pustaka proyek LLVM. Ia menggantikan GDB di Xcode 5 dan sejak itu menjadi alat debugging utama untuk seluruh ekosistem Apple. Berbeda dengan GDB monolitik, LLDB diimplementasikan sebagai kumpulan pustaka yang saling berinteraksi: setiap fungsi — dari parsing ekspresi hingga bekerja dengan memori — ditempatkan dalam modul terpisah, yang menyederhanakan pemeliharaan dan pengembangan.
Kemampuan utama LLDB meliputi: mengatur breakpoints berbagai jenis, watchpoints untuk melacak perubahan variabel, inspeksi memori dan register, eksekusi langkah demi langkah, evaluasi ekspresi arbitrer dalam konteks program yang dijeda, dan eksekusi skrip Python untuk otomatisasi. Menurut repositori LLVM, LLDB mendukung lebih dari 200 perintah debugging dan kompatibel dengan format DWARF dan Mach-O — format utama informasi debugging di ekosistem Apple.
Keunggulan penting LLDB adalah integrasi mendalam dengan Clang. Berkat penggunaan kompiler yang sama untuk parsing dan kompilasi kode sumber, LLDB dapat mengevaluasi ekspresi C++ dan Objective-C dengan akurasi yang tidak dapat dicapai GDB. Untuk debugging Swift, LLDB menggunakan modul terpisah Swift Language Runtime yang memahami semantik bahasa: tipe opsional, protokol, generik, dan manajemen memori melalui ARC.
Versi pertama LLDB muncul pada tahun 2010 sebagai bagian dari LLVM 2.8. Pada tahun 2013, ia sepenuhnya menggantikan GDB di Xcode. Pada tahun 2019 dengan dirilisnya Xcode 11, LLDB mendapatkan dukungan untuk Swift Error Breakpoints dan parser ekspresi yang ditingkatkan untuk Swift. Menurut Apple, mulai iOS 14, seluruh stack debugging untuk simulator juga bekerja melalui LLDB, yang menegaskan statusnya sebagai alat debugging utama platform.
Arsitektur LLDB dibangun berdasarkan prinsip mikrolayanan: setiap subsistem ada sebagai pustaka terpisah (dylib), terhubung dengan yang lain melalui API bersama. Ini membedakannya dari GDB, di mana semua fungsi digabungkan dalam satu file biner. Struktur modular memungkinkan penggunaan komponen LLDB secara independen — misalnya, parser ekspresi dapat ditanamkan ke dalam IDE tanpa menghubungkan debugger lengkap.
| Komponen LLDB | Tujuan | Pustaka |
|---|---|---|
| Core | Manajemen proses debugging, peristiwa, status thread | liblldbCore.dylib |
| Expression Parser | Parsing dan eksekusi ekspresi (C/C++/ObjC/Swift) | liblldbExpression.dylib |
| Symbol File | Membaca DWARF, Mach-O, dSYM — bekerja dengan informasi debugging | liblldbSymbol.dylib |
| Target Control | Manajemen eksekusi: memulai, menghentikan, langkah-langkah | liblldbTarget.dylib |
| Interpreter | Baris perintah dan mode REPL | liblldbInterpreter.dylib |
dSYM — adalah file informasi debugging yang dihasilkan Xcode saat kompilasi. LLDB menggunakannya untuk menghubungkan kode mesin dengan kode sumber: tanpa dSYM, debugger hanya menampilkan alamat memori, bukan nama fungsi dan baris kode. Untuk aplikasi App Store, file dSYM diunggah secara terpisah ke server Apple dan digunakan untuk simbolisasi crash-log yang diterima dari pengguna melalui 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
Perintah LLDB dibagi menjadi beberapa kategori: manajemen eksekusi, bekerja dengan breakpoints, inspeksi data, dan manipulasi memori. Berbeda dengan GUI Xcode, konsol LLDB memberikan kontrol penuh atas debugging dan memungkinkan operasi yang tidak tersedia melalui antarmuka grafis — misalnya, mengubah nilai variabel secara langsung atau mengedit breakpoints secara massal.
Continue, Step Over, Step Into, Step Out — dasar dari siklus debugging. continue melanjutkan eksekusi hingga breakpoint berikutnya. step over mengeksekusi baris saat ini sepenuhnya. step into masuk ke dalam metode yang dipanggil. step out mengakhiri fungsi saat ini dan mengembalikan kontrol ke kode pemanggil. Selain itu ada step with type filter — langkah hingga tipe data tertentu.
(lldb) thread backtrace # Tampilkan call stack
* 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 # Tampilkan variabel lokal
(Int) userId = 42
(String) endpoint = "https://api.example.com/user/42"
(lldb) thread step-over # Step Over
(lldb) thread step-in # Step Into
LLDB menyediakan perintah untuk melihat data dalam format apa pun: memory read, frame variable, target variable. Sintaks khusus po (print object) memanggil debugDescription pada objek Objective-C dan description pada tipe Swift. Pemformat kustom diatur melalui type summary add — berguna untuk debugging struktur kompleks seperti CGRect atau IndexPath.
(lldb) po userProfile # Tampilkan deskripsi objek
<UserProfile: 0x600000c4b80>
- name: "John"
- age: 30
- email: "john@example.com"
(lldb) expression userProfile.age = 31 # Ubah nilai
(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
Evaluasi ekspresi di LLDB adalah salah satu fungsi terkuat yang tidak ada di GDB pada masa dominasinya. LLDB dapat mengeksekusi kode arbitrer dalam C, Objective-C, C++, dan Swift dalam konteks program yang dijeda, termasuk memanggil metode, membuat objek, dan memodifikasi status. Ini memungkinkan pengujian hipotesis tanpa memulai ulang aplikasi dan kompilasi ulang.
Perintah expression mengompilasi dan mengeksekusi ekspresi saat proses yang di-debug berjalan. Flag -O (object description) memanggil po. Untuk ekspresi multi-baris, gunakan expression -l Swift --. LLDB mengompilasi kode secara langsung melalui Clang atau Swift Compiler, mengintegrasikan hasilnya ke dalam konteks saat ini, dan mengembalikan nilai. Menurut Apple, ekspresi dikompilasi dalam 10–50 ms tergantung kompleksitasnya.
(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 memungkinkan tidak hanya membaca, tetapi juga mengubah status objek dan variabel selama debugging. Ini penting untuk menguji kasus batas: Anda dapat mengatur nilai variabel ke nil, mengubah warna elemen UI, atau mengganti respons server langsung di debugger, tanpa kompilasi ulang dan mulai ulang. Teknik ini banyak digunakan dalam pengembangan game dan aplikasi dengan alur panjang, di mana mulai ulang memakan banyak waktu.
(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 LLDB memungkinkan penulisan skrip untuk mengotomatiskan debugging. Melalui Python, Anda dapat membuat perintah kustom, menangani peristiwa breakpoint, menghasilkan laporan, dan bahkan menimpa perilaku debugger. Interpreter Python 3 bawaan berjalan langsung di dalam LLDB, dengan akses ke API debugging penuh melalui modul lldb.
Perintah LLDB baru dapat didaftarkan melalui dekorator @classmethod dalam skrip Python. Setelah mengimpor skrip, perintah menjadi tersedia seperti perintah bawaan. Misalnya, perintah printvars dapat menampilkan semua variabel dari frame saat ini beserta tipe dan nilainya, diformat untuk proyek tertentu. Otomatisasi mengurangi waktu operasi debugging tipikal sebesar 60–80%, menurut survei pengembang iOS di 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}")
Melalui Python API, skrip dapat dilampirkan ke pemicu breakpoint. Atur breakpoint, lalu jalankan breakpoint command add dan tentukan fungsi Python. Ini memungkinkan pencatatan status secara otomatis, mengirim data ke analitik, atau memeriksa invarian tanpa intervensi manual. Menurut LLVM, pendekatan ini digunakan dalam infrastruktur Apple untuk mengumpulkan metrik kinerja pada tahap pengembangan.
(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) — mode interaktif LLDB, dipanggil dengan perintah lldb --repl atau melalui Xcode Debug Console. Di REPL, Anda dapat mengeksekusi kode dalam Swift atau C seperti di playground, dengan umpan balik instan. LLDB mengompilasi setiap baris, mengeksekusinya, dan menampilkan hasilnya — ini nyaman untuk bereksperimen dengan API, membuat prototipe algoritma, dan mempelajari fitur bahasa baru tanpa membuat proyek.
(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
Mode REPL juga mendukung pemuatan modul dan framework melalui import. Misalnya, import UIKit di REPL memuat seluruh pustaka UIKit, dan Anda dapat membuat elemen UI, memeriksa constraint, dan menguji animasi. Ini adalah kemampuan unik bagi pengembang iOS yang tidak tersedia di GDB — debugging dan pembuatan prototipe dalam satu lingkungan.
Berkat integrasi dengan Swift Compiler, LLDB REPL digunakan dalam kursus Apple untuk mengajar Swift. Siswa dapat mengeksekusi kode baris demi baris, melihat tipe dan hasil, tanpa terganggu oleh konfigurasi proyek. Pendekatan ini sesuai dengan metode Active Learning, di mana umpan balik interaktif mempercepat penyerapan materi sebesar 40% menurut penelitian di bidang Computer Science Education.
Pertanyaan Umum
LLDB dibangun di atas arsitektur modular LLVM, yang memberinya keunggulan dalam kecepatan bekerja dengan ekspresi dan dukungan bahasa modern (Swift). GDB adalah debugger monolitik yang tidak mendukung Swift dan memiliki kemampuan skrip terbatas.
Instal Command Line Tools melalui xcode-select --install, lalu jalankan lldb --repl di terminal. LLDB tersedia di /Library/Developer/CommandLineTools/usr/bin/.
Ya, melalui lldb --attach-pid PID atau process attach --name AppName. LLDB akan menjeda proses, setelah itu semua perintah debugging standar tersedia tanpa memulai ulang aplikasi.
File dSYM informasi debugging tidak ada. Periksa pengaturan Build Settings: Generate Debug Symbols harus YES, dan Debug Information Format harus DWARF with dSYM File.
LLDB secara otomatis menyimpan riwayat di ~/.lldb/lldb-history. Untuk ekspor, gunakan session save filename.txt — perintah ini menyimpan semua perintah yang dieksekusi dari sesi saat ini ke file teks.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga