Debug (sozlash rejimi) — mobil ilovani yig'ish konfiguratsiyasi bo'lib, unda kompilyator simvolik ma'lumotni qo'shadi, kod optimallashtirishni o'chiradi va bosqichma-bosqich tahlil qilish uchun debugger ulaydi. Android Developers ma'lumotiga ko'ra, Debug yig'ishi sozlash simvollarini o'z ichiga oladi, resurslarni siqmaydi va ma'lumotlar bazasi va tarmoq so'rovlari inspektorini ulash imkonini beradi. Debug rejimi Release yig'ishiga qarama-qarshi qo'yiladi: Debug-da dasturchi kod shaffofligi uchun unumdorlikdan voz kechadi.
Asosiy
Debug (sozlash) — bu shunchaki kompilyator bayrog'i emas, balki ilovani dasturchi uchun shaffof qiladigan sozlamalar to'plamidir. Debug rejimida kompilyator bajariladigan faylga simvolik nomlar jadvali (DWARF) qo'shadi, bu mashina kodini manba satrlari bilan bog'laydi. Bu jadval bo'lmasa, debugger hozirda qaysi kod satri bajarilayotganini ko'rsata olmaydi.
Debugger — ilovangizni boshqariladigan muhitda ishga tushiradigan dastur. Istalgan satrda bajarishni to'xtatib (breakpoint), joriy ko'rinish sohasidagi barcha o'zgaruvchilar qiymatlarini ko'rib, ularni joyida o'zgartirib va bajarishni davom ettirishingiz mumkin. Mobil platformalar uchun standart debugger bu LLDB — Xcode va Android Studio'da qo'llaniladigan LLVM komponenti.
Debug rejimi shuningdek Release-da o'chirilgan qo'shimcha tekshiruvlarni faollashtiradi: tasdiqlar (assertions), massiv chegaralarini tekshirish, xotira oqish detektorlari va kengaytirilgan jurnallashtirish. Bu tekshiruvlar ilova ishini sekinlashtiradi, ammo kod foydalanuvchiga yetib bormasdan oldin xatolarni rivojlanishning dastlabki bosqichlarida aniqlaydi.
Debug va Release yig'ishlari o'rtasidagi farq tubdan farq qiladi: bular kompilyator bayroqlari, imzo konfiguratsiyalari va paketlash sozlamalarining ikki xil to'plamidir. Bu farqlarni tushunish „simulyatorda ishlaydi, real qurilmada esa — yo'q” holatlaridan qochishga yordam beradi.
| Parametr | Debug | Release |
|---|---|---|
| Optimallashtirish | O'chirilgan (-O0) | Yoqilgan (-Os yoki -O2) |
| Simvollar | To'liq DWARF jadvali | Strip simvollar (olib tashlangan) |
| Imzo | Development sertifikati | Distribution sertifikati |
| Profillar | Debug provisioning profile | App Store / Ad Hoc profile |
| Jurnallashtirish | To'liq (barcha darajalar) | O'chirilgan yoki minimal |
| Obfuskatsiya | O'chirilgan | Yoqilgan (ProGuard/R8) |
| .apk/.ipa hajmi | Kattaroq (simvollar + siqish yo'q) | Kichikroq (R8 + resurslar) |
Debug yig'ishi mahalliy qurilmalarda ishlab chiqish va sinovning barcha bosqichlarida qo'llaniladi. Release yig'ishi App Store Connect yoki Google Play Console-ga yuborishdan oldin yig'iladi. Release yig'ishida sozlash texnik jihatdan mumkin, ammo o'zgartirilgan metod nomlari (R8) va crash-log'lar uchun symbolication yo'qligi sababli juda noqulay.
Tez-tez uchraydigan muammo — Debug-da ishlaydigan, ammo Release-da ishlamaydigan kod. Sabab — kompilyator turli optimallashtirish darajalarida turlicha ishlov beradigan UB (undefined behavior) kodidir. Odatdagi misol: ishga tushirilmagan o'zgaruvchini o'qish yoki strict aliasing buzilishi. Bunday xatolarni aniqlash uchun har bir Release yig'ishidan oldin statik analizatordan (Clang Static Analyzer, ktlint) foydalaning.
LLDB — C, C++, Objective-C, Swift va Kotlin/Native-ni qo'llab-quvvatlaydigan, LLVM-ga asoslangan yuqori unumdor debugger. LLDB REPL interfeysini taqdim etadi, unda ixtiyoriy ifodalarni bajarish, o'zgaruvchilar qiymatlarini o'zgartirish va to'xtatilgan ilova kontekstida funksiyalarni chaqirish mumkin.
Breakpoint — debuggerning asosiy vositasi. Kod satriga nuqta qo'yasiz va bajarish shu satrga yetganda ilova to'xtaydi. LLDB bir necha turdagi nuqtalarni qo'llab-quvvatlaydi: shartli (faqat shart bajarilganda ishlaydi), simvolik (funksiya chaqiruvida) va bir martalik (bir marta ishlaydi va avtomatik o'chiriladi).
Watchpoint — o'zgaruvchining o'zgarishini kuzatish nuqtasi. Xotira manzilini ko'rsatasiz va debugger ushbu manzilga har qanday yozishda bajarishni to'xtatadi. Bu vosita ma'lumot poygalari va umumiy ob'ektlarning noto'g'ri mutatsiyalarini qidirishda ajralmasdir. UIKit iyerarxiyasini ko'rish uchun Xcode-da mavjud UIView Inspector-dan foydalaning.
// Shartli breakpoint o'rnatish
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"
// Xususiyatga watchpoint
(lldb) watchpoint set variable self->_loadingState
// To'xtash kontekstida kod bajarish
(lldb) expr self.view.backgroundColor = UIColor.redColor
Ikkala IDE ham LLDB asosida grafik inspektorlarni taqdim etadi. Android Studio Layout Inspector (View iyerarxiyasini ko'rish), Network Inspector (HTTP so'rovlarini kuzatish) va Database Inspector (real vaqtda SQLite) ni o'z ichiga oladi. Xcode Debug Memory Graph (xotira oqish tahlili) va View Debugger (UIKit qatlamlarining 3D ko'rinishi) ni taqdim etadi.
Android 11 dan boshlab Wi-Fi orqali sozlash USB ulanishisiz ishlaydi: Android Studio-dan QR kodni skanerlash kifoya. iOS Xcode 9+ dan Wi-Fi sozlashni qo'llab-quvvatlaydi — qurilma bir marta USB orqali ulanadi, keyin debug seanslari tarmoq orqali o'tishi mumkin. CI serverlari uchun Wi-Fi sozlash mos emas, chunki oldindan aytib bo'lmaydigan kechikishlar va paket yo'qotishlari bo'lishi mumkin, shuning uchun avtomatlashtirilgan pipeline'larda doim USB ishlatiladi. Biroq, mahalliy ishlanma uchun Wi-Fi sozlash ancha qulay — dasturchi kabelga bog'lanmagan va xonaning boshqa chetidagi qurilmada ilovani sinab ko'rishi mumkin.
Android Debug Bridge (ADB) — buyruq satridan Android qurilmasi bilan o'zaro aloqa qilish uchun universal vosita. ADB orqali ilovani o'rnatish, sozlashni ishga tushirish, fayllarni nusxalash, shell buyruqlarini bajarish va jurnallarni ko'rish mumkin. Android Studio barcha sozlash operatsiyalari uchun ADB dan foydalanadi.
Android Studio ikkita sozlash rejimini qo'llab-quvvatlaydi: Run (oddiy ishga tushirish) va Debug (debugger ulangan holda ishga tushirish). Debug rejimida to'g'ridan-to'g'ri muharrirda breakpoint'lar qo'yishingiz, Debug Tool Window-da o'zgaruvchilarni ko'rishingiz va Evaluate Expression-da ifodalarni baholashingiz mumkin. Fon jarayonlarini (Service, BroadcastReceiver) sozlash uchun Attach Debugger to Android Process dan foydalaning.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Breakpoint bu yerda bajarishni to'xtatadi
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 buyruqlari root huquqlarisiz qurilmaning fayl tizimiga kirish imkonini beradi. Databases papkasining mazmunini ko'rish, .db faylini kompyuterga nusxalash va istalgan SQLite klienti bilan ochish mumkin. Android Studio Database Inspector bu jarayonni avtomatlashtiradi: ma'lumotlar bazasining jonli ma'lumotlarini real vaqtda ko'rasiz va to'g'ridan-to'g'ri IDE dan SQL so'rovlarini bajarishingiz mumkin.
Xcode LLDB asosida integratsiyalashgan sozlash muhitini taqdim etadi. Dasturchi ilovani simulyatorda yoki jismoniy qurilmada ishga tushirishi, breakpoint'lar qo'yishi va bajarish oqimlarini boshqarish uchun Debug Navigator-dan foydalanishi mumkin. Android'dan farqli o'laroq, iOS maxsus konfiguratsiyasiz bitta qurilmada bir vaqtning o'zida ikkita Debug yig'ishini ishga tushirishga ruxsat bermaydi.
Simulyator ilovani mahalliy macOS jarayoni sifatida ishga tushiradi, bu eng tez sozlash siklini ta'minlaydi. Jismoniy qurilmada sozlash USB yoki Wi-Fi (iOS 16 dan boshlab) orqali amalga oshadi va LLDB qurilmadagi debugserver bilan bog'lanadi. Qurilmada sozlash unumdorligi USB 2.0 cheklangan o'tkazish qobiliyati tufayli pastroq, ammo faqat jismoniy qurilma real stsenariylarni sinab ko'rishga imkon beradi: push bildirishnomalari, kamera, sensorlar.
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)
}
}
Xcode Organizer sinovchilarning qurilmalaridan Crash Logs orqali ishdan chiqish jurnallarini to'playdi. Symbolication (manzillarni funksiya nomlariga aylantirish) uchun har bir Debug yig'ishida yaratiladigan .dSYM fayli talab qilinadi. Release yig'ishida ham dSYM yaratiladi, ammo App Store'dan olingan ishdan chiqish jurnallarini Organizer'ga qo'lda yoki bitcode xizmati orqali yuklash kerak.
Tez-tez beriladigan savollar
Texnik jihatdan ha — Debug sertifikati bilan Ad Hoc orqali, ammo Apple va Google buni tavsiya etmaydi. Debug yig'ishi sozlash simvollarini va past unumdorlikni o'z ichiga oladi, bu UX-ni yomonlashtiradi va ilova hajmini 2–3 baravar oshiradi.
Sabab — kompilyator optimallashtirishining o'chirilganligi (-O0). Kompilyator funksiyalarni ichki joylashtirmaydi, o'lik kodni olib tashlamaydi va barcha oraliq o'zgaruvchilarni saqlaydi. Qo'shimcha ravishda, Debug Release-da mavjud bo'lmagan tasdiq va massiv chegaralarini tekshirishni faollashtiradi.
Xcode-da Window → Devices and Simulators-ni tanlang, qurilmangiz uchun „Connect via network” ni belgilang. Qurilma va Mac bir xil Wi-Fi tarmog'ida bo'lishi kerak. Bir marta USB orqali ulangandan so'ng, keyingi ishga tushirishlarda sozlash Wi-Fi orqali ishlaydi.
Attach to process ilovani qayta ishga tushirmasdan allaqachon ishlayotgan jarayonga debugger ulash imkonini beradi. Bu standart Debug Run qo'llanilmaydigan Service, BroadcastReceiver yoki tizim hodisasi bilan ishga tushirilgan jarayonlarni sozlash uchun foydalidir.
NSLog va print sukut bo'yicha faqat Debug konfiguratsiyasida jurnalni ko'rsatadi. Release uchun OSLogType.default bayrog'i bilan os_log dan foydalaning — u xabarlarni Unified Logging System da saqlaydi va Mac-da Console.app orqali mavjud.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.
Shuningdek o'qing