Mobil inkişafda Debug — sazlamanın mahiyyəti, rejimləri və işləmə prinsipi

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

Debug (sazlama rejimi) — mobil tətbiqin kompilyasiya konfiqurasiyasıdır ki, burada kompilyator simvolik məlumatı daxil edir, kod optimallaşdırmasını söndürür və addım-addım analiz üçün debuggeri qoşur. Android Developers məlumatına görə, Debug kompilasiyası sazlama simvollarını ehtiva edir, resursları sıxışdırmır və verilənlər bazası və şəbək sorğuları inspektorunu qoşmağa imkan verir. Debug rejimi Release kompilasiyasına qarşı qoyulur: Debug-da tərtibatçı kodun şəffaflığı üçün performansdan qurban verir.

Başlıca

  • Debug — sazlama məlumatı, söndürülmüş optimallaşdırma və debuggerə çıxışı olan kompilyasiya konfiqurasiyası
  • Debugger dayanma nöqtələri qoymağa, dəyişənlərə baxmağa və kodu addım-addım yerinə yetirməyə imkan verir
  • Debug kompilasiyası sazlama sertifikatı ilə imzalanır və tətbiq mağazalarında dərc edilə bilməz
  • LLDB — iOS/macOS üçün əsas debugger, Android Studio-da LLDB isə Android üçün
  • Performans Debug kompilasiyası Release-dən aşağıdır, çünki kompilyator optimallaşdırmaları yoxdur

Mobil inkişafda Debug rejiminin mahiyyəti

Debug (sazlama) — sadəcə kompilyator bayrağı deyil, tətbiqi tərtibatçı üçün şəffaf edən parametrlər toplusudur. Debug rejimində kompilyator icra olunan fayla simvolik adlar cədvəli (DWARF) əlavə edir ki, bu da maşın kodunu mənbə sətirləri ilə əlaqələndirir. Bu cədvəl olmadan debugger hazırda hansı kod sətrinin icra olunduğunu göstərə bilməz.

Debugger — tətbiqinizi idarə olunan mühitdə işə salan proqramdır. İstənilən sətirdə icranı dayandıra (breakpoint), cari görüntü sahəsindəki bütün dəyişənlərin qiymətlərinə baxa, onları anlıq dəyişdirə və icranı davam etdirə bilərsiniz. Mobil platformalar üçün standart debugger LLDB-dir — həm Xcode, həm də Android Studio-da istifadə olunan LLVM komponenti.

Debug rejimi həmçinin Release-də söndürülmüş əlavə yoxlamaları aktivləşdirir: təsdiqləmələr (assertions), massiv sərhəd yoxlamaları, yaddaş sızıntısı detektorları və genişləndirilmiş jurnallaşdırma. Bu yoxlamalar tətbiqin işini ləngidir, lakin kodu istifadəçiyə çatdırmamış ünkər inkişafın erkən mərhələlərində səhvləri aşkarlayır.

Debug və Release: kompilasiyaların əsas fərqləri

Debug və Release kompilasiyaları arasındakı fərq əsaslıdır: bunlar kompilyator bayraqlarının, imza konfiqurasiyalarının və paketləmə parametrlərinin iki fərqli dəstidir. Bu fərqləri başa düşmək „simulyatorda işləyir, real cihazda yox” vəziyyətlərinin qarşısını almağa kömək edir.

ParametrDebugRelease
OptimallaşdırmaSöndürülmüş (-O0)Aktiv (-Os və ya -O2)
SimvollarTam DWARF cədvəliStrip simvollar (silinmiş)
İmzaDevelopment sertifikatıDistribution sertifikatı
ProfillərDebug provisioning profileApp Store / Ad Hoc profile
JurnallaşdırmaTam (bütün səviyyələr)Söndürülmüş və ya minimal
ObfuskasiyaSöndürülmüşAktiv (ProGuard/R8)
.apk/.ipa ölçüsüBöyük (simvollar + sıxışdırma yox)Kiçik (R8 + resurslar)

Nə vaxt nə istifadə olunur

Debug kompilasiyası yerli cihazlarda inkişaf və test mərhələlərinin hamısında istifadə olunur. Release kompilasiyası App Store Connect və ya Google Play Console-a göndərməzdən əvvəl yığılır. Release kompilasiyasında sazlama texniki olaraq mümkündür, lakin metod adlarının dəyişdirilməsi (R8) və çökmə jurnalları üçün symbolication olmaması səbəbindən çox əlverişsizdir.

Rejim dəyişdirmə problemləri

Tez-tez rast gəlinən problem — Debug-da işləyən, lakin Release-də çökən koddur. Səbəb — kompilyatorun müxtəlif optimallaşdırma səviyyələrində fərqli işlədiyi UB (undefined behavior) kodudur. Tipik nümunələr: ilkinləşdirilməmiş dəyişənin oxunması və ya strict aliasing pozuntusu. Belə səhvləri aşkar etmək üçün hər Release kompilasiyasından əvvəl statik analizatordan (Clang Static Analyzer, ktlint) istifadə edin.

Sazlama alətləri: LLDB, dayanma nöqtələri və inspektorlar

LLDB — C, C++, Objective-C, Swift və Kotlin/Native dəstəkləyən, LLVM əsaslı yüksək performanslı debuggerdir. LLDB REPL interfeysi təqdim edir ki, burada ixtiyari ifadələri icra edə, dəyişənlərin qiymətlərini dəyişdirə və dayandırılmış tətbiq kontekstində funksiyaları çağıra bilərsiniz.

Dayanma nöqtələri və onların növləri

Breakpoint — debuggerin əsas alətidir. Kod sətri üzərində nöqtə qoyursunuz və icra həmin sətrə çatdıqda tətbiq dayanır. LLDB bir neçə nöqtə növünü dəstəkləyir: şərti (yalnız şərt ödəndikdə işləyir), simvolik (funksiya çağırışında) və birdəfəlik (bir dəfə işləyib avtomatik silinir).

Watchpointlər və yaddaş inspektorları

Watchpoint — dəyişənin dəyişməsinin müşahidə nöqtəsidi. Yaddaş ünvanını göstərirsiniz və debugger həmin ünvana hər yazılışda icranı dayandırır. Bu alət məlumat yarışları və paylaşılan obyektlərin səhv mutasiyalarını axtararkan əvəzedilməzdir. UIKit iyerarxiyasına baxmaq üçün Xcode-da mövcud olan UIView Inspector-dan istifadə edin.

lldb
// Şərti breakpoint-in qurulması
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"

// Xassəyə watchpoint
(lldb) watchpoint set variable self->_loadingState

// Dayanma kontekstində kodun icrası
(lldb) expr self.view.backgroundColor = UIColor.redColor

Xcode və Android Studio inspektorları

Hər iki IDE LLDB əsasında qrafik inspektorlar təqdim edir. Android Studio Layout Inspector (View iyerarxiyasına baxış), Network Inspector (HTTP sorğularını izləmə) və Database Inspector (real vaxtda SQLite) daxildir. Xcode Debug Memory Graph (yaddaş sızıntısı analizi) və View Debugger (UIKit təbəqələrinin 3D görünüşü) təqdim edir.

Uzaqdan sazlama və Wi-Fi vasitəsilə sazlama

Android 11-dən başlayaraq Wi-Fi vasitəsilə sazlama USB qoşulması olmadan işləyir: sadəcə Android Studio-dan QR kodu skan etmək kifayətdir. iOS Xcode 9+-dan Wi-Fi sazlamasını dəstəkləyir — cihaz bir dəfə USB ilə qoşulur, sonra debug sessiyaları şəbəkə üzərindən keçə bilər. CI serverləri üçün Wi-Fi sazlaması uyğun deyil, çünki gözlənilməz gecikmələr və paket itkiləri ola bilər, buna görə avtomatlaşdırılmış pipeline-larda həmişə USB istifadə olunur. Bununla belə, yerli inkişaf üçün Wi-Fi sazlaması daha rahatdır — tərtibatçı kabelə bağlı deyil və otağın digər başındakı cihazda tətbiqi test edə bilər.

Android-də Debug: Android Studio və ADB ilə sazlama

Android Debug Bridge (ADB) — Android cihazı ilə komanda sətri vasitəsilə qarşılıqlı əlaqə üçün universal alətdir. ADB vasitəsilə tətbiqi quraşdıra, sazlamanı işə sala, faylları köçürə, shell əmrlərini icra edə və jurnallara baxa bilərsiniz. Android Studio bütün sazlama əməliyyatları üçün ADB-dən istifadə edir.

Android Studio-da debuggerin qoşulması

Android Studio iki sazlama rejimini dəstəkləyir: Run (adi işə salma) və Debug (debugger qoşulmuş işə salma). Debug rejimində birbaşa redaktorda breakpointlər qoya, Debug Tool Window-da dəyişənlərə baxa və Evaluate Expression-də ifadələri qiymətləndirə bilərsiniz. Fon proseslərinin (Service, BroadcastReceiver) sazlaması üçün Attach Debugger to Android Process istifadə edin.

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Breakpoint burada icranı dayandıracaq
        val button = findViewById<Button>(R.id.btn_debug)
        button.setOnClickListener {
            startDebugProcess()
        }
    }

    private fun startDebugProcess() {
        val data = fetchDataFromApi()
        Log.d("Debug", "Data loaded: $data")
    }
}

ADB shell və verilənlər bazasının yoxlanması

ADB shell əmrləri root hüquqları olmadan cihazın fayl sisteminə giriş imkanı verir. Databases qovluğunun məzmununa baxa, .db faylını kompüterə köçürə və istənilən SQLite müştərisi ilə aça bilərsiniz. Android Studio Database Inspector bu prosesi avtomatlaşdırır: verilənlər bazasının canlı məlumatlarını real vaxtda görür və birbaşa IDE-dən SQL sorğuları icra edə bilərsiniz.

iOS-da Debug: Xcode, debugger və diaqnostika

Xcode LLDB əsasında inteqrasiya olunmuş sazlama mühiti təmin edir. Tərtibatçı tətbiqi simulyatorda və ya fiziki cihazda işə sala, breakpointlər qura və icra axınlarını idarə etmək üçün Debug Navigator-dan istifadə edə bilər. Android-dən fərqli olaraq, iOS xüsusi konfiqurasiya olmadan bir cihazda eyni anda iki Debug kompilasiyasını işə salmağa imkan vermir.

Simulyatorda və cihazda sazlama

Simulyator tətbiqi yerli macOS prosesi kimi işə salır ki, bu da ən sürətli sazlama dövrünü təmin edir. Fiziki cihazda sazlama USB və ya Wi-Fi (iOS 16-dan etibarən) vasitəsilə baş verir və LLDB cihazdakı debugserver ilə əlaqə qurur. Cihazda sazlama performansı USB 2.0 məhdud ötürücük qabiliyyətinə görə aşağıdır, lakin yalnız fiziki cihaz real ssenariləri test etməyə imkan verir: push bildirişləri, kamera, sensorlar.

swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    private func setupUI() {
        let label = UILabel()
        label.text = "Debug Mode"
        label.textColor = .systemBlue
        view.addSubview(label)
    }
}

Diaqnostika və çökmə hesabatları

Xcode Organizer testçilərin cihazlarından Crash Logs vasitəsilə çökmə jurnallarını toplayır. Symbolication (ünvanların funksiya adlarına çevrilməsi) üçün hər Debug kompilasiyasında yaradılan .dSYM faylı tələb olunur. Release kompilasiyasında da dSYM yaradılır, lakin App Store-dan çökmə jurnalları Organizer-əl əl ilə və ya bitcode xidməti vasitəsilə yüklənməlidir.

Tez-tez verilən suallar

Debug kompilasiyasını istifadəçinin cihazında işə salmaq olarmı?

Texniki olaraq bəli — Debug sertifikatı ilə Ad Hoc vasitəsilə, lakin Apple və Google bunu tövsiyə etmir. Debug kompilasiyası sazlama simvolları və aşağı performans ehtiva edir ki, bu da UX-i pisləşdirir və tətbiqin ölçüsünü 2–3 dəfə artırır.

Niyə Debug kompilasiyası Release-dən yavaş işləyir?

Səbəb — kompilyator optimallaşdırmasının söndürülməsi (-O0). Kompilyator funksiyaları daxil etmir, ölü kodu silmir və bütün aralıq dəyişənləri saxlayır. Əlavə olaraq Debug Release-də olmayan təsdiqləmə və massiv sərhəd yoxlamalarını aktivləşdirir.

iOS üçün Wi-Fi sazlamasını necə qurmaq olar?

Xcode-da Window → Devices and Simulators seçin, cihazınız üçün „Connect via network” işarələyin. Cihaz və Mac eyni Wi-Fi şəbəkəsində olmalıdır. Bir dəfə USB ilə qoşulduqdan sonra sonrakı işə salmalarda sazlama Wi-Fi üzərindən işləyəcək.

Android Studio-da „attach to process” nədir?

Attach to process tətbiqi yenidən başlatmadan artıq işləyən prosesə debugger qoşmağa imkan verir. Bu, standart Debug Run-un tətbiq olunmadığı Service, BroadcastReceiver və ya sistem hadisəsi ilə başladılan proseslərin sazlaması üçün faydalıdır.

Release kompilasiyasında NSLog və print-i necə görmək olar?

NSLog və print susmaya görə yalnız Debug konfiqurasiyasında jurnalı göstərir. Release üçün OSLogType.default bayrağı ilə os_log istifadə edin — o, mesajları Unified Logging System-də saxlayır və Mac-da Console.app vasitəsilə əlçatandır.

Nəticə

  • Debug kompilasiyası sazlama simvollarını ehtiva edir, optimallaşdırmanı söndürür və development imza sertifikatından istifadə edir
  • LLDB — hər iki platforma üçün əsas debugger, breakpoint, watchpoint və REPL dəstəkləyir
  • Debug və Release fərqləri optimallaşdırma, simvollar, imza, obfuskasiya və kompilasiya ölçüsünə aiddir
  • Android üçün ADBiOS üçün debugserver IDE-nin cihazla əlaqəsini təmin edir
  • Debug kompilasiyasının performansı söndürülmüş optimallaşdırmalara görə 2–5 dəfə aşağıdır
  • Çökmə jurnalları Debug kompilasiyasında oxunaqlı funksiya adları ehtiva edir, Release isə dSYM vasitəsilə symbolication tələb edir

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