LLDB: bu hansı debuggerdir, əsas əmrlər və iOS tərtibatında tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-05-07 Oxuma vaxtı: 9 dəq

LLDB (Low-Level Debugger) — LLVM layihəsinin yeni nəsil debuggeri, iOS, macOS, tvOS və watchOS üçün tətbiqlərin debug edilməsi üçün Xcode-un tərkibinə daxildir. GDB-dən fərqli olaraq, LLDB LLVM kompilyatoru ilə modul arxitekturadan istifadə edir, bu da yüksək sürət və dəqiqlik təmin edir. LLVM Project-in məlumatına görə, LLDB C, Objective-C, C++ və Swift dillərində debug-u tam funksiya dəsti ilə dəstəkləyir: breakpoints, watchpoints, yaddaş inspeksiyası və addım-addım icra.

Əsas məqamlar

  • LLDB — LLVM alətlərinə əsaslanan açıq mənbəli standart Xcode debuggeri.
  • Modul LLDB arxitekturası bir-birindən asılı olmayan parsering, icra və vizuallaşdırma kitabxanalarından ibarətdir.
  • LLDB əmrləri breakpoints qurmağa, dəyişənləri yoxlamağa, ifadələri icra etməyə və debug zamanı vəziyyəti dəyişməyə imkan verir.
  • Python API LLDB debug ssenarilərini avtomatlaşdırmaq üçün xüsusi skriptlər yaratmağa imkan verir.
  • REPL rejimi LLDB Swift və C dilində kodla təcrübə aparmaq üçün interaktiv mühit kimi işləyir.

LLDB nədir və necə qurulub

LLDB — LLVM layihəsinin kitabxanaları üzərində qurulmuş açıq mənbəli debuggerdir. O, Xcode 5-də GDB-ni əvəz etdi və o vaxtdan bəri bütün Apple ekosistemi üçün əsas debug alətidir. Monolit GDB-dən fərqli olaraq, LLDB qarşılıqlı əlaqədə olan kitabxanalar dəsti kimi reallaşdırılıb: ifadələrin parseringindən yaddaşla işə qədər hər bir funksiya ayrıca modula çıxarılıb, bu da texniki xidməti və genişləndirməni asanlaşdırır.

LLDB-nin əsas imkanlarına aşağıdakılar daxildir: istənilən tipdə breakpoints qurmaq, dəyişən dəyişikliklərini izləmək üçün watchpoints, yaddaş və registrlərin inspeksiyası, addım-addım icra, dayandırılmış proqram kontekstində ixtiyari ifadələrin hesablanması və avtomatlaşdırma üçün Python skriptlərinin icrası. LLVM repozitoriyasının məlumatına görə, LLDB 200-dən çox debug əmrini dəstəkləyir və Apple ekosistemində debug məlumatının əsas formatları olan DWARF və Mach-O formatları ilə uyğundur.

LLDB-nin mühüm üstünlüyü Clang ilə dərin inteqrasiyadır. Mənbə kodunun parseringi və kompilyasiyası üçün eyni kompilyatordan istifadə sayəsində LLDB C++ və Objective-C ifadələrini GDB üçün əlçatmaz dəqiqliklə hesablaya bilir. Swift debug-u üçün LLDB dilin semantikasını başa düşən ayrıca Swift Language Runtime modulundan istifadə edir: opsional tiplər, protokollar, generiklər və ARC vasitəsilə yaddaşın idarə edilməsi.

Tarix və təkamül

LLDB-nin ilk versiyası 2010-cu ildə LLVM 2.8-in bir hissəsi olaraq ortaya çıxdı. 2013-cü ilə qədər Xcode-da GDB-ni tamamilə əvəz etdi. 2019-cu ildə Xcode 11-in buraxılması ilə LLDB Swift Error Breakpoints dəstəyi və Swift üçün təkmilləşdirilmiş ifadə parseri aldı. Apple-ın məlumatına görə, iOS 14-dən etibarən simulator üçün bütün debug stack-i də LLDB vasitəsilə işləyir ki, bu da onun platformanın əsas debug aləti statusunu təsdiqləyir.

LLDB arxitekturası: modullar və komponentlər

LLDB arxitekturası mikroxidmətlər prinsipi üzərində qurulub: hər bir alt sistem ümumi API vasitəsilə digərləri ilə əlaqəli ayrıca kitabxana (dylib) kimi mövcuddur. Bu, onu bütün funksiyaların bir binar faylda birləşdirildiyi GDB-dən fərqləndirir. Modul strukturu LLDB komponentlərindən müstəqil istifadə etməyə imkan verir — məsələn, ifadə parserini tam debuggeri birləşdirmədən IDE-yə daxil etmək olar.

LLDB komponentiTəyinatıKitabxana
CoreDebug prosesinin idarə edilməsi, hadisələr, thread vəziyyətləriliblldbCore.dylib
Expression Parserİfadələrin parseringi və icrası (C/C++/ObjC/Swift)liblldbExpression.dylib
Symbol FileDWARF, Mach-O, dSYM oxunması — debug məlumatı ilə işliblldbSymbol.dylib
Target Controlİcranın idarə edilməsi: başlatma, dayandırma, addımlarliblldbTarget.dylib
InterpreterƏmr sətri və REPL rejimiliblldbInterpreter.dylib

LLDB və dSYM debug simvolları

dSYM — Xcode-un kompilasiya zamanı yaratdığı debug məlumatı fayllarıdır. LLDB onlardan maşın kodunu mənbə kodu ilə əlaqələndirmək üçün istifadə edir: dSYM olmadan debugger funksiya adları və kod sətirləri əvəzinə yalnız yaddaş ünvanlarını göstərir. App Store tətbiqləri üçün dSYM faylları Apple serverinə ayrıca yüklənir və CrashReporter vasitəsilə istifadəçilərdən alınan crash-loqların simvolizasiyası üçün istifadə olunur.

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

LLDB-nin əsas debug əmrləri

LLDB əmrləri bir neçə kateqoriyaya bölünür: icranın idarə edilməsi, breakpoints ilə iş, məlumat inspeksiyası və yaddaş manipulyasiyası. Xcode GUI-dən fərqli olaraq, LLDB konsolu debug üzərində tam nəzarət verir və qrafik interfeys vasitəsilə əlçatmaz əməliyyatları yerinə yetirməyə imkan verir — məsələn, dəyişənin dəyərini anında dəyişmək və ya breakpoints-ların kütləvi redaktəsi.

İcra idarəetmə əmrləri

Continue, Step Over, Step Into, Step Out — debug dövrünün əsasını təşkil edir. continue növbəti breakpoint-a qədər icranı bərpa edir. step over cari sətri tamamilə icra edir. step into çağırılan metodun daxilinə daxil olur. step out cari funksiyanı bitirir və idarəni çağıran koda qaytarır. Əlavə olaraq step with type filter mövcuddur — müəyyən məlumat tipinə qədər addım.

lldb
(lldb) thread backtrace          # Zəng yığınını göstər
* 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          # Yerli dəyişənləri göstər
(Int) userId = 42
(String) endpoint = "https://api.example.com/user/42"
(lldb) thread step-over        # Step Over
(lldb) thread step-in          # Step Into

Məlumat inspeksiyası və formatlayıcılar

LLDB istənilən formatda məlumatlara baxmaq üçün əmrlər təqdim edir: memory read, frame variable, target variable. Xüsusi po (print object) sintaksisi Objective-C obyektlərində debugDescription-u və Swift tiplərində description-u çağırır. Xüsusi formatlayıcılar type summary add vasitəsilə təyin edilir — CGRect və ya IndexPath kimi mürəkkəb strukturların debug-u üçün faydalıdır.

lldb
(lldb) po userProfile           # Obyektin təsvirini çıxar
<UserProfile: 0x600000c4b80>
  - name: "John"
  - age: 30
  - email: "john@example.com"
(lldb) expression userProfile.age = 31    # Dəyəri dəyiş
(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

İfadələrin hesablanması və obyekt inspeksiyası

İfadələrin hesablanması LLDB-də GDB-nin dominasiya dövründə çatışmayan ən güclü funksiyalardan biridir. LLDB dayandırılmış proqram kontekstində C, Objective-C, C++ və Swift-də ixtiyari kodu icra edə bilər, o cümlədən metod çağırışları, obyekt yaratma və vəziyyət dəyişikliyi. Bu, tətbiqi yenidən başlatmadan və yenidən kompilə etmədən hipotezləri yoxlamağa imkan verir.

expression və po əmrləri

expression əmri debug edilən prosesin icra müddətində ifadəni kompilə edir və icra edir. -O (object description) flag-ı po-nu çağırır. Çoxsətirli ifadələr üçün expression -l Swift -- istifadə edin. LLDB kodu anında Clang və ya Swift Compiler vasitəsilə kompilə edir, nəticəni cari kontekstə inteqrasiya edir və dəyəri qaytarır. Apple-ın məlumatına görə, ifadə mürəkkəbliyindən asılı olaraq 10–50 ms ərzində kompilə olunur.

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

Obyektlərin anında dəyişdirilməsi

LLDB yalnız oxumağa deyil, həm də debug zamanı obyekt və dəyişənlərin vəziyyətini dəyişməyə imkan verir. Bu, sərhəd hallarının test edilməsi üçün kritik əhəmiyyət daşıyır: dəyişənin dəyərini nil-ə təyin etmək, UI elementinin rəngini dəyişmək və ya server cavabını birbaşa debuggerdə əvəz etmək olar, yenidən kompilə etmədən və yenidən başlatmadan. Bu texnika oyunların və uzun axınlı tətbiqlərin hazırlanmasında geniş istifadə olunur, burada yenidən başlatma çox vaxt aparı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-də Python skriptləri

Python API LLDB debug-u avtomatlaşdırmaq üçün skriptlər yazmağa imkan verir. Python vasitəsilə xüsusi əmrlər yaratmaq, breakpoint hadisələrini emal etmək, hesabatlar yaratmaq və hətta debuggerin davranışını dəyişdirmək olar. Daxili Python 3 interpretatoru birbaşa LLDB daxilində işə düşür və lldb modulu vasitəsilə tam debug API-nə çıxış əldə edir.

Xüsusi əmr yaratmaq

Yeni LLDB əmrini Python skriptində @classmethod dekoratoru vasitəsilə qeydiyyatdan keçirmək olar. Skript idxal edildikdən sonra əmr daxili əmr kimi əlçatan olur. Məsələn, printvars əmri cari çərçivənin bütün dəyişənlərini tipləri və dəyərləri ilə, müəyyən layihə üçün formatlaşdırılmış şəkildə göstərə bilər. Avtomatlaşdırma tipik debug əməliyyatlarının vaxtını 60–80% azaldır, Stack Overflow-da iOS tərtibatçıları arasında keçirilən sorğuya gö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}")

Breakpoint hadisələrinin emalı

Python API vasitəsilə breakpoint-işə düşməsinə skript bağlamaq olar. Breakpoint qurun, sonra breakpoint command add icra edin və Python funksiyasını göstərin. Bu, avtomatik olaraq vəziyyəti log-lamağa, analitikaya məlumat göndərməyə və ya əl ilə müdaxilə olmadan invariantları yoxlamağa imkan verir. LLVM-in məlumatına görə, bu yanaşma Apple infrastrukturunda tərtibat mərhələsində performans metrikalarının toplanması üçün istifadə olunur.

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 rejimi və playground

REPL (Read-Eval-Print Loop)lldb --repl əmri və ya Xcode Debug Console vasitəsilə çağırılan interaktiv LLDB rejimidir. REPL-də Swift və ya C-də kodu playground-dakı kimi, ani geribildirimlə icra etmək olar. LLDB hər sətri kompilə edir, icra edir və nəticəni göstərir — bu, API ilə təcrübə aparmaq, alqoritmləri prototipləşdirmək və layihə yaratmadan dilin yeni imkanlarını öyrənmək üçün əlverişlidir.

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 rejimi həmçinin import vasitəsilə modulların və freymvorkların yüklənməsini dəstəkləyir. Məsələn, REPL-də import UIKit bütün UIKit kitabxanasını yükləyir və UI elementləri yaratmaq, constraint-ləri yoxlamaq və animasiyaları test etmək olar. Bu, iOS tərtibatçıları üçün GDB-də olmayan unikal imkandır — debug və prototipləşdirmə bir mühitdə.

Swift-in öyrənilməsi üçün REPL-dən istifadə

Swift Compiler ilə inteqrasiya sayəsində LLDB REPL Apple kurslarında Swift-in öyrədilməsi üçün istifadə olunur. Tələbələr kodu sətir-sətir icra edə, tipləri və nəticələri görə bilər, layihənin konfiqurasiyasına vaxt itirmədən. Bu yanaşma Active Learning metodikasına uyğundur, burada interaktiv geribildirim Computer Science Education sahəsində araşdırmalara görə materialın mənimsənilməsini 40% sürətləndirir.

Tez-tez verilən suallar

LLDB GDB-dən nə ilə fərqlənir?

LLDB modul LLVM arxitekturası üzərində qurulub, bu ona ifadələrlə iş sürətində və müasir dillərin (Swift) dəstəyində üstünlük verir. GDB — monolit debuggerdir, Swift-i dəstəkləmir və məhdud skript imkanlarına malikdir.

Xcode olmadan macOS-da LLDB REPL-i necə işə salmaq olar?

Command Line Tools-u xcode-select --install vasitəsilə quraşdırın, sonra terminalda lldb --repl icra edin. LLDB /Library/Developer/CommandLineTools/usr/bin/ ünvanında mövcuddur.

LLDB-ni artıq işləyən prosesə qoşmaq olarmı?

Bəli, lldb --attach-pid PID və ya process attach --name AppName vasitəsilə. LLDB prosesi dayandıracaq, bundan sonra tətbiqi yenidən başlatmadan bütün standart debug əmrləri əlçatan olur.

Niyə LLDB mənbə kodunu yox, yalnız assembler göstərir?

dSYM faylları debug məlumatı yoxdur. Build Settings-də yoxlayın: Generate Debug Symbols YES, Debug Information Format isə DWARF with dSYM File olmalıdır.

LLDB əmr tarixçəsini necə saxlamaq olar?

LLDB avtomatik olaraq tarixçəni ~/.lldb/lldb-history-də saxlayır. İxrac üçün session save filename.txt istifadə edin — əmr cari sessiyanın bütün icra edilmiş əmrlərini mətn faylına yazır.

Nəticə

  • LLDB — LLVM layihəsinin yeni nəsil debuggeri, Xcode və bütün Apple ekosistemi üçün standart.
  • Modul arxitektura: Core, Expression Parser, Symbol File və Interpreter kitabxanaları.
  • LLDB əmrləri icra idarəetməsi, breakpoints, məlumat inspeksiyası və ifadə hesablanmasına bölünür.
  • İfadələrin anında hesablanması — kodu yenidən başlatmadan test etməyə imkan verən əsas imkan.
  • Python API debugger üzərində tam nəzarət verir: xüsusi əmrlər, breakpoint emalı, hesabatlar.
  • REPL rejimi Swift və C üçün interaktiv playground kimi işləyir, öyrənmə və prototipləşdirmə üçün faydalıdır.
  • dSYM faylları crash-loqların simvolizasiyası və mənbə kodunun düzgün göstərilməsi üçün vacibdir.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun