Debug в мобилното разработване — същност на режимите за дебаг и как работи

Автор: IT Sectr Публикувано: 2026-05-06 Време за четене: 8 мин

Debug (режим отклањања) — је конфигурација компилације мобилне апликације у којој компилер укључује симболичке информације, искључује оптимизацију кода и повезује дебагер за корак по корак анализу. Према Android Developers, Debug билд садржи симболе отклањања, не компримира ресурсе и омогућује повезивање инспектора базе података и мрежних захтева. Режим Debug се супротставља Release билду: у Debug-у програмер жртвује перформансе ради транспарентности извршавања кода.

Главно

  • Debug — конфигурација компилације са информацијом за отклањање, искљученом оптимизацијом и приступом дебагеру
  • Дебагер омогућује постављање тачака заустављања, преглед промењивих и извршавање кода корак по корак
  • Debug билд се потписује дебаг цертификатом и не може бити објављен у продавницама апликација
  • LLDB — главни дебагер за iOS/macOS, а LLDB у Android Studio — за Android
  • Перформансе Debug билда је нижи од Release-а због недостатка оптимизација компилера

Суштина Debug режима у мобилном развоју

Debug (отклањање) — није само заставица компилера, већ цео низ подешавања који чине апликацију транспарентном за програмера. У Debug режиму, компилер додаје у извршиви фајл табелу симболичких имена (DWARF) која повезује машински код са изворним линијама. Без ове табеле, дебагер не може да покаже која линија кода се тренутно извршава.

Дебагер — програм који покреће вашу апликацију у контролисаном окружењу. Можете зауставити извршавање на било којој линији (breakpoint), прегледати вредности свих промењивих у тренутном опсегу видљивости, мењати их у ходу и наставити извршавање. За мобилне платформе, стандардни дебагер је LLDB — LLVM компонента која се користи и у Xcode и у Android Studio.

Debug режим такође укључује додатне провере које су искључене у Release: тврдње (assertions), провере граница низова, детекторе цурења меморије и проширено водење евиденције. Ове провере успоравају рад апликације, али откривају грешке у раним фазама развоја — пре него што код стигне до корисника.

Debug и Release: кључне разлике билдова

Разлика између Debug и Release билдова је основна: то су два различита сета заставица компилера, конфигурација потписивања и поставки паковања. Разумевање ових разлика помаже да се избегну ситуације када „ради у симулатору, а на реалном уређају — не”.

ПараметарDebugRelease
ОптимизацијаИскључена (-O0)Укључена (-Os или -O2)
СимболиПуна DWARF табелаStrip симболи (уклоњени)
ПотписDevelopment цертификатDistribution цертификат
ПрофилиDebug provisioning profileApp Store / Ad Hoc profile
Водење евиденцијеПуно (сви нивои)Искључено или минимално
ОбфускацијаИскљученаУкључена (ProGuard/R8)
Величина .apk/.ipaВећа (симболи + без компресије)Мања (R8 + ресурси)

Када шта користити

Debug билд се користи у свим фазама развоја и тестирања на локалним уређајима. Release билд се прави пре слања у App Store Connect или Google Play Console. Отклањање на Release билду је технички могуће, али изузетно незгодно због преименованих метода (R8) и недостатка symbolication за дневнике падова.

Проблеми пребацивања режима

Један од честих проблема је код који ради у Debug-у, али пада у Release-у. Узрок је UB (undefined behavior) у коду који компилер различито обрађује са различитим нивоима оптимизације. Типичан примјер: читање неиницијализоване промењиве или кршење strict aliasing. За откривање таквих грешака користите статички анализатор (Clang Static Analyzer, ktlint) пре сваког Release билда.

Алати за отклањање: LLDB, тачке заустављања и инспектори

LLDB — је високоперформансни дебагер заснован на LLVM-у, који подржава C, C++, Objective-C, Swift и Kotlin/Native. LLDB пружа REPL интерфејс у коме можете извршавати произвољне изразе, мењати вредности промењивих и позивати функције у контексту заустављене апликације.

Тачке заустављања и њихови типови

Breakpoint — кључни алат дебагера. Постављате тачку на линији кода, и апликација се зауставља када извршавање стигне до те линије. LLDB подржава више типова тачака: условне (активирају се само по испуњењу услова), симболичке (на позив функције) и једнократне (активирају се једном и аутоматски се уклањају).

Watchpoint-и и инспектори меморије

Watchpoint — тачка праћења промене промењиве. Наведете адресу меморије, и дебагер зауставља извршавање при сваком уписивању на ту адресу. Овај алат је неопходан при проналажењу утрка података и неисправних мутација дељених објеката. За преглед хијерархије UIKit користите UIView Inspector доступан у Xcode-у.

lldb
// Настрояване на условен breakpoint
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"

// Watchpoint на свойство
(lldb) watchpoint set variable self->_loadingState

// Изпълнение на код в контекста на спиране
(lldb) expr self.view.backgroundColor = UIColor.redColor

Xcode и Android Studio инспектори

Оба IDE-а пружају графичке инспекторе засноване на LLDB-у. Android Studio укључује Layout Inspector (преглед хијерархије View-а), Network Inspector (праћење HTTP захтева) и Database Inspector (SQLite у реалном времену). Xcode пружа Debug Memory Graph (анализа цурења меморије) и View Debugger (3D приказ слојева UIKit-а).

Даљинско отклањање и отклањање путем Wi-Fi

Од Android 11 на даље, отклањање путем Wi-Fi ради без USB везе: довољно је скеновати QR код из Android Studio. iOS подржава Wi-Fi отклањање од Xcode 9+ — уређај се повезује једном путем USB, након чега сесије отклањања могу одвијати путем мреже. За CI сервере, Wi-Fi отклањање није погодно због непредвидљивих кашњења и губитка пакета, па се у аутоматизованим pipeline-има увијек користи USB. Ипак, за локални развој, Wi-Fi отклањање је знатно удобније — програмер није везан за кабл и може да тестира апликацију на уређају који се налази на другом крају собе.

Debug на Android-у: Android Studio и отклањање кроз ADB

Android Debug Bridge (ADB) — универзални алат за интеракцију са Android уређајем из командне линије. Путем ADB-а можете инсталирати апликацију, покренути отклањање, копирати датотеке, извршавати shell наредбе и прегледати дневнике. Android Studio користи ADB у позадини за све операције отклањања.

Повезивање дебагера у Android Studio

Android Studio подржава два режима отклањања: Run (нормално покретање) и Debug (покретање са повезаним дебагером). У Debug режиму можете да постављате breakpoint-е директно у редактору, прегледате промењиве у Debug Tool Window и процењујете изразе у Evaluate Expression. За отклањање позадинских процеса (Service, BroadcastReceiver) користите Attach Debugger to Android Process.

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

        // Breakpoint тук ще спре изпълнението
        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 и инспекција база података

ADB shell наредбе пружају приступ фајл систему уређаја без root права. Можете прегледати садржај директоријума databases, копирати .db датотеку на рачунар и отворити је било којим SQLite клијентом. Android Studio Database Inspector аутоматизује овај процес: видите живе податке базе у реалном времену и можете извршавати SQL упите директно из IDE.

Debug на iOS-у: Xcode, дебагер и дијагностика

Xcode пружа интегрирано окружење за отклањање засновано на LLDB-у. Програмер може да покрене апликацију на симулатору или физичком уређају, постави breakpoint-е и користи Debug Navigator за контролу токова извршавања. За разлику од Android-а, iOS не дозвољава покретање два Debug билда истовремено на једном уређају без специјалне конфигурације.

Отклањање у симулатору и на уређају

Симулатор покреће апликацију као нативни macOS процес, што омогућује најбржи циклус отклањања. На физичком уређају, отклањање се одвија путем USB или Wi-Fi (од iOS 16 на даље), и LLDB комуницира са debugserver-ом на уређају. Перформансе отклањања на уређају је нижи због ограниченог протока USB 2.0, али само физички уређај омогућује тестирање реалних сценарија: push обавештења, камеру, сензоре.

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

Дијагностика и извештаји о падовима

Xcode Organizer прикупља дневнике падова са уређаја тестера путем Crash Logs. За symbolication (претварање адреса у имена функција) потребна је .dSYM датотека која се генерише при сваком Debug билду. У Release билду, dSYM такође се креира, али се дневници падова из App Store морају учитавати у Organizer ручно или путем bitcode сервиса.

Често постављана питања

Може ли се Debug билд покренути на корисничком уређају?

Технички да — путем Ad Hoc са Debug цертификатом, али Apple и Google то не препоручују. Debug билд садржи симболе отклањања и смањену перформансу, што погоршава UX и повећава величину апликације 2–3 пута.

Зашто је Debug билд спорији од Release-а?

Разлог — искључена оптимизација компилера (-O0). Компилер не уграђује функције, не уклања мртви код и чува све посредне промењиве. Додатно, Debug укључује провере тврдња и граница низова којих нема у Release-у.

Како подесити Wi-Fi отклањање за iOS?

У Xcode-у изаберите Window → Devices and Simulators, означите „Connect via network” за ваш уређај. Уређај и Mac морају бити у истој Wi-Fi мрежи. Након једног повезивања путем USB, отклањање ће радити путем Wi-Fi при следећим покретањима.

Шта је „attach to process” у Android Studio?

Attach to process омогућује повезивање дебагера на већ покренути процес без поновног покретања апликације. Ово је корисно за отклањање Service-а, BroadcastReceiver-а или процеса који се покрећу системским догађајем, где стандардни Debug Run није примењив.

Како видети NSLog и print у Release билду?

NSLog и print по подразумевању приказују лог само у Debug конфигурацији. За Release користите os_log са OSLogType.default заставицом — чува поруке у Unified Logging System и доступан је кроз Console.app на Mac-у.

Резиме

  • Debug билд садржи симболе отклањања, искључује оптимизацију и користи development цертификат за потпис
  • LLDB — главни дебагер за обе платформе, подржава breakpoint-е, watchpoint-е и REPL
  • Разлике Debug и Release се односе на оптимизацију, симболе, потпис, обфускацију и величину билда
  • ADB за Android и debugserver за iOS омогућују комуникацију IDE-а са уређајем
  • Перформансе Debug билда је 2–5 пута нижи због искључених оптимизација
  • Дневници падова Debug билда садрже читљиве називе функција, Release захтевају symbolication кроз dSYM

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също