Debug (режим отклањања) — је конфигурација компилације мобилне апликације у којој компилер укључује симболичке информације, искључује оптимизацију кода и повезује дебагер за корак по корак анализу. Према Android Developers, Debug билд садржи симболе отклањања, не компримира ресурсе и омогућује повезивање инспектора базе података и мрежних захтева. Режим Debug се супротставља Release билду: у Debug-у програмер жртвује перформансе ради транспарентности извршавања кода.
Главно
Debug (отклањање) — није само заставица компилера, већ цео низ подешавања који чине апликацију транспарентном за програмера. У Debug режиму, компилер додаје у извршиви фајл табелу симболичких имена (DWARF) која повезује машински код са изворним линијама. Без ове табеле, дебагер не може да покаже која линија кода се тренутно извршава.
Дебагер — програм који покреће вашу апликацију у контролисаном окружењу. Можете зауставити извршавање на било којој линији (breakpoint), прегледати вредности свих промењивих у тренутном опсегу видљивости, мењати их у ходу и наставити извршавање. За мобилне платформе, стандардни дебагер је LLDB — LLVM компонента која се користи и у Xcode и у Android Studio.
Debug режим такође укључује додатне провере које су искључене у Release: тврдње (assertions), провере граница низова, детекторе цурења меморије и проширено водење евиденције. Ове провере успоравају рад апликације, али откривају грешке у раним фазама развоја — пре него што код стигне до корисника.
Разлика између Debug и Release билдова је основна: то су два различита сета заставица компилера, конфигурација потписивања и поставки паковања. Разумевање ових разлика помаже да се избегну ситуације када „ради у симулатору, а на реалном уређају — не”.
| Параметар | Debug | Release |
|---|---|---|
| Оптимизација | Искључена (-O0) | Укључена (-Os или -O2) |
| Симболи | Пуна DWARF табела | Strip симболи (уклоњени) |
| Потпис | Development цертификат | Distribution цертификат |
| Профили | Debug provisioning profile | App 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 — је високоперформансни дебагер заснован на LLVM-у, који подржава C, C++, Objective-C, Swift и Kotlin/Native. LLDB пружа REPL интерфејс у коме можете извршавати произвољне изразе, мењати вредности промењивих и позивати функције у контексту заустављене апликације.
Breakpoint — кључни алат дебагера. Постављате тачку на линији кода, и апликација се зауставља када извршавање стигне до те линије. LLDB подржава више типова тачака: условне (активирају се само по испуњењу услова), симболичке (на позив функције) и једнократне (активирају се једном и аутоматски се уклањају).
Watchpoint — тачка праћења промене промењиве. Наведете адресу меморије, и дебагер зауставља извршавање при сваком уписивању на ту адресу. Овај алат је неопходан при проналажењу утрка података и неисправних мутација дељених објеката. За преглед хијерархије UIKit користите UIView Inspector доступан у Xcode-у.
// Постављање условног breakpoint-а
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"
// Watchpoint на својство
(lldb) watchpoint set variable self->_loadingState
// Извршавање кода у контексту заустављања
(lldb) expr self.view.backgroundColor = UIColor.redColor
Оба IDE-а пружају графичке инспекторе засноване на LLDB-у. Android Studio укључује Layout Inspector (преглед хијерархије View-а), Network Inspector (праћење HTTP захтева) и Database Inspector (SQLite у реалном времену). Xcode пружа Debug Memory Graph (анализа цурења меморије) и View Debugger (3D приказ слојева UIKit-а).
Од Android 11 на даље, отклањање путем Wi-Fi ради без USB везе: довољно је скеновати QR код из Android Studio. iOS подржава Wi-Fi отклањање од Xcode 9+ — уређај се повезује једном путем USB, након чега сесије отклањања могу одвијати путем мреже. За CI сервере, Wi-Fi отклањање није погодно због непредвидљивих кашњења и губитка пакета, па се у аутоматизованим pipeline-има увијек користи USB. Ипак, за локални развој, Wi-Fi отклањање је знатно удобније — програмер није везан за кабл и може да тестира апликацију на уређају који се налази на другом крају собе.
Android Debug Bridge (ADB) — универзални алат за интеракцију са Android уређајем из командне линије. Путем ADB-а можете инсталирати апликацију, покренути отклањање, копирати датотеке, извршавати shell наредбе и прегледати дневнике. Android Studio користи ADB у позадини за све операције отклањања.
Android Studio подржава два режима отклањања: Run (нормално покретање) и Debug (покретање са повезаним дебагером). У Debug режиму можете да постављате breakpoint-е директно у редактору, прегледате промењиве у Debug Tool Window и процењујете изразе у Evaluate Expression. За отклањање позадинских процеса (Service, BroadcastReceiver) користите Attach Debugger to Android Process.
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 наредбе пружају приступ фајл систему уређаја без root права. Можете прегледати садржај директоријума databases, копирати .db датотеку на рачунар и отворити је било којим SQLite клијентом. Android Studio Database Inspector аутоматизује овај процес: видите живе податке базе у реалном времену и можете извршавати SQL упите директно из IDE.
Xcode пружа интегрирано окружење за отклањање засновано на LLDB-у. Програмер може да покрене апликацију на симулатору или физичком уређају, постави breakpoint-е и користи Debug Navigator за контролу токова извршавања. За разлику од Android-а, iOS не дозвољава покретање два Debug билда истовремено на једном уређају без специјалне конфигурације.
Симулатор покреће апликацију као нативни macOS процес, што омогућује најбржи циклус отклањања. На физичком уређају, отклањање се одвија путем USB или Wi-Fi (од iOS 16 на даље), и LLDB комуницира са debugserver-ом на уређају. Перформансе отклањања на уређају је нижи због ограниченог протока USB 2.0, али само физички уређај омогућује тестирање реалних сценарија: push обавештења, камеру, сензоре.
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 сервиса.
Често постављана питања
Технички да — путем Ad Hoc са Debug цертификатом, али Apple и Google то не препоручују. Debug билд садржи симболе отклањања и смањену перформансу, што погоршава UX и повећава величину апликације 2–3 пута.
Разлог — искључена оптимизација компилера (-O0). Компилер не уграђује функције, не уклања мртви код и чува све посредне промењиве. Додатно, Debug укључује провере тврдња и граница низова којих нема у Release-у.
У Xcode-у изаберите Window → Devices and Simulators, означите „Connect via network” за ваш уређај. Уређај и Mac морају бити у истој Wi-Fi мрежи. Након једног повезивања путем USB, отклањање ће радити путем Wi-Fi при следећим покретањима.
Attach to process омогућује повезивање дебагера на већ покренути процес без поновног покретања апликације. Ово је корисно за отклањање Service-а, BroadcastReceiver-а или процеса који се покрећу системским догађајем, где стандардни Debug Run није примењив.
NSLog и print по подразумевању приказују лог само у Debug конфигурацији. За Release користите os_log са OSLogType.default заставицом — чува поруке у Unified Logging System и доступан је кроз Console.app на Mac-у.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође