LLDB: bu hata ayıklayıcı nedir, temel komutlar ve iOS geliştirmede kullanımı

Yazar: IT Sectr Yayınlanma: 2026-05-07 Okuma süresi: 9 dk

LLDB (Low-Level Debugger), LLVM projesinin yeni nesil hata ayıklayıcısıdır ve iOS, macOS, tvOS ve watchOS altındaki uygulamaları hata ayıklamak için Xcode'a dahildir. GDB'den farklı olarak LLDB, LLVM derleyicisi ile modüler bir mimari kullanarak yüksek hız ve doğruluk sağlar. LLVM Projesi'ne göre LLDB, kesme noktaları, izleme noktaları, bellek incelemesi ve adım adım yürütme gibi eksiksiz bir özellik seti ile C, Objective-C, C++ ve Swift dillerinde hata ayıklamayı destekler.

Önemli Noktalar

  • LLDB, LLVM araç zincirine dayalı açık kaynak kodlu standart Xcode hata ayıklayıcısıdır.
  • Modüler LLDB mimarisi, birbirinden bağımsız ayrıştırma, yürütme ve görselleştirme kütüphanelerinden oluşur.
  • LLDB komutları, kesme noktaları ayarlamaya, değişkenleri incelemeye, ifadeleri yürütmeye ve hata ayıklama sırasında durumu değiştirmeye olanak tanır.
  • LLDB'nin Python API'si, hata ayıklama senaryolarını otomatikleştirmek için özel betikler oluşturmayı sağlar.
  • LLDB'nin REPL modu, Swift ve C koduyla deney yapmak için etkileşimli bir ortam olarak çalışır.

LLDB nedir ve nasıl çalışır

LLDB, LLVM projesi kütüphaneleri üzerine inşa edilmiş açık kaynaklı bir hata ayıklayıcıdır. Xcode 5'te GDB'nin yerini almış ve o zamandan beri tüm Apple ekosistemi için birincil hata ayıklama aracı haline gelmiştir. Tek parçalı GDB'nin aksine LLDB, etkileşimli kütüphaneler kümesi olarak uygulanmıştır: ifade ayrıştırmadan bellek yönetimine kadar her işlev, bakımı ve genişletmeyi basitleştiren ayrı bir modüle yerleştirilmiştir.

LLDB'nin temel yetenekleri şunları içerir: her türden kesme noktası ayarlama, değişken değişikliklerini izlemek için izleme noktaları, bellek ve yazmaç incelemesi, adım adım yürütme, durdurulmuş bir program bağlamında rastgele ifadeleri değerlendirme ve otomasyon için Python betikleri çalıştırma. LLVM deposuna göre LLDB, 200'den fazla hata ayıklama komutunu destekler ve Apple ekosistemindeki ana hata ayıklama bilgi biçimleri olan DWARF ve Mach-O biçimleriyle uyumludur.

LLDB'nin önemli bir avantajı, Clang ile derin entegrasyonudur. Kaynak kodu ayrıştırmak ve derlemek için aynı derleyiciyi kullanarak LLDB, GDB'de bulunmayan bir doğrulukla C++ ve Objective-C ifadelerini değerlendirebilir. Swift hata ayıklama için LLDB, dil semantiğini (isteğe bağlı türler, protokoller, generics ve ARC aracılığıyla bellek yönetimi) anlayan ayrı bir Swift Language Runtime modülü kullanır.

Tarih ve Evrim

LLDB'nin ilk sürümü 2010 yılında LLVM 2.8'in bir parçası olarak ortaya çıktı. 2013 itibarıyla Xcode'da GDB'nin tamamen yerini almıştı. 2019'da Xcode 11'in piyasaya sürülmesiyle LLDB, Swift Hata Kesme Noktaları desteği ve Swift için geliştirilmiş bir ifade ayrıştırıcı kazandı. Apple'a göre, iOS 14'ten itibaren simülatör için tüm hata ayıklama yığını da LLDB aracılığıyla çalışarak platformun birincil hata ayıklama aracı statüsünü doğrulamaktadır.

LLDB Mimarisi: Modüller ve Bileşenler

LLDB mimarisi mikro hizmet prensibi üzerine inşa edilmiştir: her alt sistem, ortak bir API aracılığıyla diğerlerine bağlı ayrı bir kütüphane (dylib) olarak bulunur. Bu, tüm işlevlerin tek bir ikili dosyada birleştirildiği GDB'den ayırır. Modüler yapı, LLDB bileşenlerinin bağımsız olarak kullanılmasına olanak tanır — örneğin, ifade ayrıştırıcı, tam hata ayıklayıcıyı bağlamadan bir IDE'ye gömülebilir.

LLDB BileşeniAmaçKütüphane
CoreHata ayıklama süreci yönetimi, olaylar, iş parçacığı durumlarıliblldbCore.dylib
Expression Parserİfade ayrıştırma ve yürütme (C/C++/ObjC/Swift)liblldbExpression.dylib
Symbol FileDWARF, Mach-O, dSYM okuma — hata ayıklama bilgileriyle çalışmaliblldbSymbol.dylib
Target ControlYürütme kontrolü: başlatma, durdurma, adımlarliblldbTarget.dylib
InterpreterKomut satırı ve REPL moduliblldbInterpreter.dylib

LLDB ve dSYM Hata Ayıklama Sembolleri

dSYM, Xcode'un derleme sırasında oluşturduğu hata ayıklama bilgi dosyalarıdır. LLDB bunları makine kodunu kaynak kodla eşleştirmek için kullanır: dSYM olmadan hata ayıklayıcı, işlev adları ve kod satırları yerine yalnızca bellek adreslerini gösterir. App Store uygulamaları için dSYM dosyaları Apple sunucusuna ayrı olarak yüklenir ve CrashReporter aracılığıyla kullanıcılardan alınan çökme günlüklerini sembolize etmek için kullanılır.

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

Hata Ayıklama için Temel LLDB Komutları

LLDB komutları birkaç kategoriye ayrılır: yürütme kontrolü, kesme noktası yönetimi, veri inceleme ve bellek manipülasyonu. Xcode GUI'sinin aksine, LLDB konsolu hata ayıklama üzerinde tam kontrol sağlar ve grafik arayüz aracılığıyla kullanılamayan işlemlere izin verir — örneğin, bir değişkenin değerini anında değiştirme veya kesme noktalarını toplu olarak düzenleme.

Yürütme Kontrol Komutları

Continue, Step Over, Step Into, Step Out — hata ayıklama döngüsünün temeli. continue bir sonraki kesme noktasına kadar yürütmeyi sürdürür. step over geçerli satırı tamamen yürütür. step into çağrılan metodun içine girer. step out geçerli işlevi tamamlar ve kontrolü çağıran koda geri verir. Ayrıca step with type filter (belirtilen veri türüne kadar adım) bulunur.

lldb
(lldb) thread backtrace          # Çağrı yığınını göster
* 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          # Yerel değişkenleri göster
(Int) userId = 42
(String) endpoint = "https://api.example.com/user/42"
(lldb) thread step-over        # Step Over
(lldb) thread step-in          # Step Into

Veri İnceleme ve Biçimlendiriciler

LLDB, verileri herhangi bir biçimde görüntülemek için komutlar sağlar: memory read, frame variable, target variable. Özel sözdizimi po (print object), Objective-C nesnelerinde debugDescription'ı ve Swift türlerinde description'ı çağırır. Özel biçimlendiriciler type summary add ile ayarlanır — CGRect veya IndexPath gibi karmaşık yapıların hata ayıklaması için kullanışlıdır.

lldb
(lldb) po userProfile           # Nesne tanımını yazdır
<UserProfile: 0x600000c4b80>
  - name: "John"
  - age: 30
  - email: "john@example.com"
(lldb) expression userProfile.age = 31    # Değeri değiştir
(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

İfade Değerlendirme ve Nesne İnceleme

İfade değerlendirme, LLDB'deki en güçlü özelliklerden biridir ve GDB'nin egemen olduğu dönemde yoktu. LLDB, durdurulmuş bir program bağlamında C, Objective-C, C++ ve Swift'de rastgele kod yürütebilir; buna yöntem çağırma, nesne oluşturma ve durum değiştirme dahildir. Bu, uygulamayı yeniden başlatmadan ve yeniden derlemeden hipotezleri test etmeye olanak tanır.

expression ve po Komutları

expression komutu, hata ayıklanan sürecin çalışma zamanında bir ifadeyi derler ve yürütür. -O bayrağı (object description) po'yu tetikler. Çok satırlı ifadeler için expression -l Swift -- kullanın. LLDB, Clang veya Swift Derleyicisi aracılığıyla anında kodu derler, sonucu geçerli bağlama entegre eder ve değeri döndürür. Apple'a göre, bir ifade karmaşıklığa bağlı olarak 10–50 ms'de derlenir.

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

Anında Nesne Değiştirme

LLDB, hata ayıklama sırasında nesnelerin ve değişkenlerin durumunu yalnızca okumaya değil, aynı zamanda değiştirmeye de olanak tanır. Bu, uç durumları test etmek için kritiktir: bir değişken nil olarak ayarlanabilir, bir UI öğesinin rengi değiştirilebilir veya bir sunucu yanıtı doğrudan hata ayıklayıcıda değiştirilebilir, yeniden derleme ve yeniden başlatma olmadan. Bu teknik, yeniden başlatmanın çok zaman aldığı oyun geliştirme ve uzun akışlı uygulamalarda yaygın olarak kullanılır.

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

LLDB'de Python Betikleme

LLDB'deki Python API, hata ayıklama otomasyonu için betikler yazmaya olanak tanır. Python aracılığıyla özel komutlar oluşturabilir, kesme noktası olaylarını işleyebilir, raporlar oluşturabilir ve hatta hata ayıklayıcının davranışını geçersiz kılabilirsiniz. Yerleşik Python 3 yorumlayıcısı, lldb modülü aracılığıyla tam hata ayıklama API'sine erişimle doğrudan LLDB içinde çalışır.

Özel Komut Oluşturma

Bir Python betiğinde @classmethod dekoratörü aracılığıyla yeni bir LLDB komutu kaydedilebilir. Betik içe aktarıldıktan sonra komut, yerleşik bir komut olarak kullanılabilir hale gelir. Örneğin, printvars komutu, geçerli çerçevenin tüm değişkenlerini türleri ve değerleriyle birlikte belirli bir proje için biçimlendirilmiş olarak çıktılayabilir. Stack Overflow'daki iOS geliştiricileri üzerinde yapılan bir ankete göre, otomasyon tipik hata ayıklama işlemlerinin süresini %60–80 oranında azaltır.

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

Kesme Noktası Olaylarını İşleme

Python API aracılığıyla, bir betik kesme noktasının tetiklenmesine bağlanabilir. Bir kesme noktası ayarlayın, ardından breakpoint command add komutunu çalıştırın ve bir Python işlevi belirtin. Bu, manuel müdahale olmadan otomatik olarak durumu günlüğe kaydetmeye, verileri analitiğe göndermeye veya değişmezleri kontrol etmeye olanak tanır. LLVM'ye göre, bu yaklaşım Apple'ın altyapısında geliştirme sırasında performans metrikleri toplamak için kullanılır.

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 Modu ve Oyun Alanı

REPL (Read-Eval-Print Loop), lldb --repl komutu veya Xcode Hata Ayıklama Konsolu aracılığıyla çağrılan etkileşimli bir LLDB modudur. REPL'de, bir oyun alanında olduğu gibi Swift veya C kodu yürütebilir, anında geri bildirim alabilirsiniz. LLDB her satırı derler, yürütür ve sonucu gösterir — API'lerle deney yapmak, algoritmaların prototipini oluşturmak ve proje oluşturmadan dilin yeni özelliklerini öğrenmek için kullanışlıdır.

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 modu ayrıca import aracılığıyla modül ve framework yüklemeyi de destekler. Örneğin, REPL'de import UIKit tüm UIKit kütüphanesini yükler ve UI öğeleri oluşturabilir, kısıtlamaları kontrol edebilir ve animasyonları test edebilirsiniz. Bu, iOS geliştiricileri için GDB'de bulunmayan benzersiz bir yetenektir — aynı ortamda hata ayıklama ve prototipleme.

Swift Öğrenmek için REPL Kullanımı

Swift Derleyicisi ile entegrasyon sayesinde, LLDB REPL Apple kurslarında Swift öğretmek için kullanılır. Öğrenciler, proje kurulumuyla dikkatleri dağılmadan kod satır satır yürütebilir, türleri ve sonuçları görebilir. Bu yaklaşım, Bilgisayar Bilimi Eğitimi araştırmalarına göre etkileşimli geri bildirimin materyal anlayışını %40 hızlandırdığı Aktif Öğrenme metodolojisini izler.

Sıkça Sorulan Sorular

LLDB'nin GDB'den farkı nedir?

LLDB, modüler bir LLVM mimarisi üzerine inşa edilmiştir ve bu ona ifade değerlendirme hızı ve modern diller (Swift) desteğinde avantaj sağlar. GDB, Swift'i desteklemeyen ve sınırlı betikleme yeteneklerine sahip tek parçalı bir hata ayıklayıcıdır.

Xcode olmadan macOS'ta LLDB REPL nasıl çalıştırılır?

xcode-select --install ile Command Line Tools'ı yükleyin, ardından terminalde lldb --repl komutunu çalıştırın. LLDB, /Library/Developer/CommandLineTools/usr/bin/ konumunda bulunur.

LLDB zaten çalışan bir sürece bağlanabilir mi?

Evet, lldb --attach-pid PID veya process attach --name AppName ile. LLDB süreci duraklatır, ardından uygulamayı yeniden başlatmadan tüm standart hata ayıklama komutları kullanılabilir.

LLDB neden kaynak kodu yerine assembly gösteriyor?

dSYM hata ayıklama bilgi dosyaları eksik. Build Settings'i kontrol edin: Generate Debug Symbols YES olmalı ve Debug Information Format DWARF with dSYM File olmalıdır.

LLDB komut geçmişi nasıl kaydedilir?

LLDB, geçmişi otomatik olarak ~/.lldb/lldb-history konumuna kaydeder. Dışa aktarmak için session save filename.txt kullanın — komut, geçerli oturumun yürütülen tüm komutlarını bir metin dosyasına kaydeder.

Özet

  • LLDB, LLVM projesinden yeni nesil bir hata ayıklayıcıdır, Xcode ve tüm Apple ekosistemi için standarttır.
  • Modüler mimari: Core, Expression Parser, Symbol File ve Interpreter kütüphaneleri.
  • LLDB komutları yürütme kontrolü, kesme noktaları, veri inceleme ve ifade değerlendirme olarak ayrılır.
  • Anında ifade değerlendirme, yeniden başlatmadan kodu test etmeye olanak tanıyan anahtar bir yetenektir.
  • Python API, betikler aracılığıyla hata ayıklayıcı üzerinde tam kontrol sağlar: özel komutlar, kesme noktası işleme, raporlar.
  • REPL modu, Swift ve C için etkileşimli bir oyun alanı olarak çalışır, öğrenme ve prototipleme için kullanışlıdır.
  • dSYM dosyaları, çökme günlüklerini sembolize etmek ve kaynak kodunu doğru görüntülemek için gereklidir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun