LLDB: debugger apa ini, perintah dasar dan penerapan dalam pengembangan iOS

Penulis: IT Sectr Diterbitkan: 2026-05-07 Waktu membaca: 9 mnt

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 — debugger standar Xcode dengan sumber terbuka berbasis perangkat LLVM.
  • Arsitektur modular LLDB terdiri dari pustaka untuk parsing, eksekusi, dan visualisasi yang independen satu sama lain.
  • Perintah LLDB memungkinkan mengatur breakpoints, memeriksa variabel, mengeksekusi ekspresi, dan mengubah status selama debugging.
  • Python API LLDB memberikan kemampuan untuk membuat skrip kustom guna mengotomatisasi skenario debugging.
  • Mode REPL LLDB berfungsi sebagai lingkungan interaktif untuk bereksperimen dengan kode dalam Swift dan C.

Apa itu LLDB dan bagaimana strukturnya

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.

Sejarah dan evolusi

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: modul dan komponen

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 LLDBTujuanPustaka
CoreManajemen proses debugging, peristiwa, status threadliblldbCore.dylib
Expression ParserParsing dan eksekusi ekspresi (C/C++/ObjC/Swift)liblldbExpression.dylib
Symbol FileMembaca DWARF, Mach-O, dSYM — bekerja dengan informasi debuggingliblldbSymbol.dylib
Target ControlManajemen eksekusi: memulai, menghentikan, langkah-langkahliblldbTarget.dylib
InterpreterBaris perintah dan mode REPLliblldbInterpreter.dylib

LLDB dan simbol debugging dSYM

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
(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 dasar LLDB untuk debugging

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.

Perintah manajemen eksekusi

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
(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

Inspeksi data dan pemformat

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
(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 dan inspeksi objek

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 dan po

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
(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

Modifikasi objek secara langsung

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
(lldb) expr self.label.text = @"Updated"
(lldb) expr -l Swift -- (self as! UIViewController).view.backgroundColor = .red
(lldb) expr let $snapshot = self.view.debugQuickLookObject()

Skrip Python dalam LLDB

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.

Membuat perintah kustom

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.

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

Menangani peristiwa breakpoints

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

Mode REPL dan playground

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
(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.

Menggunakan REPL untuk belajar Swift

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

Apa perbedaan LLDB dengan GDB?

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.

Bagaimana cara menjalankan LLDB REPL di macOS tanpa Xcode?

Instal Command Line Tools melalui xcode-select --install, lalu jalankan lldb --repl di terminal. LLDB tersedia di /Library/Developer/CommandLineTools/usr/bin/.

Bisakah LLDB terhubung ke proses yang sudah berjalan?

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.

Mengapa LLDB tidak menampilkan kode sumber, hanya assembler?

File dSYM informasi debugging tidak ada. Periksa pengaturan Build Settings: Generate Debug Symbols harus YES, dan Debug Information Format harus DWARF with dSYM File.

Bagaimana cara menyimpan riwayat perintah LLDB?

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

  • LLDB — debugger generasi baru dari proyek LLVM, standar untuk Xcode dan seluruh ekosistem Apple.
  • Arsitektur modular dengan pustaka Core, Expression Parser, Symbol File, dan Interpreter.
  • Perintah LLDB dibagi menjadi manajemen eksekusi, breakpoints, inspeksi data, dan evaluasi ekspresi.
  • Evaluasi ekspresi secara langsung — kemampuan kunci yang memungkinkan pengujian kode tanpa mulai ulang.
  • Python API memberikan kontrol penuh atas debugger melalui skrip: perintah kustom, penanganan breakpoints, laporan.
  • Mode REPL berfungsi sebagai playground interaktif untuk Swift dan C, berguna untuk belajar dan membuat prototipe.
  • File dSYM diperlukan untuk simbolisasi crash-log dan tampilan kode sumber yang benar.

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.

Diskusikan proyek

Baca juga