Debug (режим отладки) — это конфигурация сборки мобильного приложения, в которой компилятор включает символьную информацию, отключает оптимизацию кода и подключает отладчик для пошагового анализа выполнения. По данным Android Developers, Debug-сборка содержит отладочные символы, не сжимает ресурсы и позволяет подключать инспектор баз данных и сетевых запросов. Режим Debug противопоставляется Release-сборке: в Debug разработчик жертвует производительностью ради прозрачности исполнения кода.
Главное
Debug (отладка) — это не просто флаг компилятора, а целый набор настроек, которые делают приложение прозрачным для разработчика. В Debug-режиме компилятор добавляет в исполняемый файл таблицу символьных имён (DWARF), которая связывает машинный код с исходными строками. Без этой таблицы отладчик не может показать, какая строка кода выполняется в текущий момент.
Отладчик (debugger) — программа, которая запускает ваше приложение в контролируемой среде. Вы можете приостановить выполнение на любой строке (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 — точка наблюдения за изменением переменной. Вы указываете адрес памяти, и отладчик приостанавливает выполнение при любой записи в этот адрес. Этот инструмент незаменим при поиске гонок данных и некорректных мутаций shared-объектов. Для просмотра иерархии 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 отладка не подходит из-за непредсказуемых задержек и потери пакетов, поэтому в автоматизированных пайплайнах всегда используют USB. Впрочем, для локальной разработки Wi-Fi-отладка заметно удобнее — разработчик не привязан к кабелю и может тестировать приложение на устройстве, находящемся в другом конце комнаты.
Android Debug Bridge (ADB) — универсальный инструмент для взаимодействия с Android-устройством из командной строки. Через ADB можно установить приложение, запустить отладку, скопировать файлы, выполнить shell-команды и просмотреть логи. Android Studio использует ADB под капотом для всех отладочных операций.
Android Studio поддерживает два режима отладки: Run (обычный запуск) и Debug (запуск с подключённым отладчиком). В режиме Debug вы можете устанавливать breakpoints прямо в редакторе, просматривать переменные в 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. Разработчик может запустить приложение на симуляторе или физическом устройстве, установить breakpoints и использовать Debug Navigator для контроля потоков выполнения. В отличие от Android, iOS не позволяет запускать две Debug-сборки одновременно на одном устройстве без специальной конфигурации.
Симулятор запускает приложение как native 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 включает проверки assertions и границ массивов, которые отсутствуют в 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также