Debug dalam pengembangan seluler — esensi mode debugging dan cara kerjanya

Penulis: IT Sectr Diterbitkan: 2026-05-06 Waktu membaca: 8 mnt

Debug (mode debugging) — adalah konfigurasi build aplikasi seluler di mana compiler menyertakan informasi simbolik, menonaktifkan optimalisasi kode, dan menghubungkan debugger untuk analisis langkah demi langkah. Menurut Android Developers, build Debug berisi simbol debugging, tidak mengompresi sumber daya, dan memungkinkan menghubungkan inspector database dan permintaan jaringan. Mode Debug berlawanan dengan build Release: dalam Debug, pengembang mengorbankan kinerja demi transparansi eksekusi kode.

Poin Utama

  • Debug — konfigurasi build dengan informasi debugging, optimalisasi dinonaktifkan, dan akses ke debugger
  • Debugger memungkinkan mengatur breakpoint, melihat variabel, dan mengeksekusi kode langkah demi langkah
  • Build Debug ditandatangani dengan sertifikat debugging dan tidak dapat dipublikasikan di toko aplikasi
  • LLDB — debugger utama untuk iOS/macOS, dan LLDB di Android Studio — untuk Android
  • Kinerja build Debug lebih rendah dari Release karena tidak adanya optimalisasi compiler

Esensi mode Debug dalam pengembangan seluler

Debug (debugging) — bukan sekadar flag compiler, melainkan serangkaian pengaturan yang membuat aplikasi transparan bagi pengembang. Dalam mode Debug, compiler menambahkan tabel nama simbolik (DWARF) ke file yang dapat dieksekusi, yang menghubungkan kode mesin dengan baris sumber asli. Tanpa tabel ini, debugger tidak dapat menunjukkan baris kode mana yang sedang dieksekusi.

Debugger — program yang menjalankan aplikasi Anda di lingkungan yang terkontrol. Anda dapat menjeda eksekusi di baris mana pun (breakpoint), melihat nilai semua variabel di cakupan saat ini, mengubahnya dengan cepat, dan melanjutkan eksekusi. Untuk platform seluler, debugger standar adalah LLDB — komponen LLVM yang digunakan baik di Xcode maupun Android Studio.

Mode Debug juga mengaktifkan pemeriksaan tambahan yang dinonaktifkan di Release: asersi (assertions), pemeriksaan batas array, detektor kebocoran memori, dan pencatatan yang diperluas. Pemeriksaan ini memperlambat aplikasi tetapi mendeteksi kesalahan pada tahap awal pengembangan — sebelum kode sampai ke pengguna.

Debug dan Release: perbedaan utama build

Perbedaan antara build Debug dan Release sangat mendasar: ini adalah dua set flag compiler, konfigurasi penandatanganan, dan pengaturan pengepakan yang berbeda. Memahami perbedaan ini membantu menghindari situasi di mana “berfungsi di simulator, tetapi di perangkat nyata — tidak”.

ParameterDebugRelease
OptimalisasiDinonaktifkan (-O0)Diaktifkan (-Os atau -O2)
SimbolTabel DWARF lengkapStrip simbol (dihapus)
PenandatangananSertifikat DevelopmentSertifikat Distribution
ProfilDebug provisioning profileApp Store / Ad Hoc profile
PencatatanLengkap (semua level)Dinonaktifkan atau minimal
ObfuskasiDinonaktifkanDiaktifkan (ProGuard/R8)
Ukuran .apk/.ipaLebih besar (simbol + tanpa kompresi)Lebih kecil (R8 + sumber daya)

Kapan menggunakan apa

Build Debug digunakan di semua tahap pengembangan dan pengujian pada perangkat lokal. Build Release dibuat sebelum dikirim ke App Store Connect atau Google Play Console. Melakukan debugging pada build Release secara teknis mungkin dilakukan, tetapi sangat tidak nyaman karena metode yang diganti namanya (R8) dan tidak adanya symbolication untuk log crash.

Masalah perpindahan mode

Salah satu masalah umum adalah kode yang berfungsi di Debug tetapi gagal di Release. Penyebabnya adalah UB (undefined behavior) dalam kode yang diproses compiler secara berbeda pada tingkat optimalisasi yang berbeda. Contoh tipikal: membaca variabel yang tidak diinisialisasi atau pelanggaran strict aliasing. Untuk mendeteksi kesalahan seperti ini, gunakan penganalisis statis (Clang Static Analyzer, ktlint) sebelum setiap build Release.

Alat debugging: LLDB, breakpoint, dan inspector

LLDB — adalah debugger berkinerja tinggi berbasis LLVM yang mendukung C, C++, Objective-C, Swift, dan Kotlin/Native. LLDB menyediakan antarmuka REPL di mana Anda dapat mengeksekusi ekspresi arbitrer, mengubah nilai variabel, dan memanggil fungsi dalam konteks aplikasi yang dijeda.

Breakpoint dan jenisnya

Breakpoint — alat utama debugger. Anda menempatkan titik pada baris kode, dan aplikasi berhenti ketika eksekusi mencapai baris tersebut. LLDB mendukung beberapa jenis titik: bersyarat (hanya aktif ketika kondisi terpenuhi), simbolik (pada pemanggilan fungsi), dan sekali pakai (aktif sekali dan dihapus otomatis).

Watchpoint dan inspector memori

Watchpoint — titik pengamatan perubahan variabel. Anda menentukan alamat memori, dan debugger menjeda eksekusi pada setiap penulisan ke alamat tersebut. Alat ini sangat diperlukan saat mencari perlombaan data dan mutasi objek bersama yang salah. Untuk melihat hierarki UIKit, gunakan UIView Inspector yang tersedia di Xcode.

lldb
// Mengatur breakpoint bersyarat
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"

// Watchpoint pada properti
(lldb) watchpoint set variable self->_loadingState

// Menjalankan kode dalam konteks penghentian
(lldb) expr self.view.backgroundColor = UIColor.redColor

Inspector Xcode dan Android Studio

Kedua IDE menyediakan inspector grafis berbasis LLDB. Android Studio mencakup Layout Inspector (melihat hierarki View), Network Inspector (melacak permintaan HTTP), dan Database Inspector (SQLite waktu nyata). Xcode menyediakan Debug Memory Graph (analisis kebocoran memori) dan View Debugger (tampilan 3D lapisan UIKit).

Debugging jarak jauh dan debugging melalui Wi-Fi

Mulai Android 11, debugging melalui Wi-Fi berfungsi tanpa koneksi USB: cukup pindai kode QR dari Android Studio. iOS mendukung debugging Wi-Fi sejak Xcode 9+ — perangkat terhubung sekali melalui USB, setelah itu sesi debugging dapat berlangsung melalui jaringan. Untuk server CI, debugging Wi-Fi tidak cocok karena latensi yang tidak dapat diprediksi dan kehilangan paket, oleh karena itu dalam pipeline otomatis selalu digunakan USB. Namun, untuk pengembangan lokal, debugging Wi-Fi jauh lebih nyaman — pengembang tidak terikat kabel dan dapat menguji aplikasi pada perangkat di seberang ruangan.

Debug di Android: Android Studio dan debugging melalui ADB

Android Debug Bridge (ADB) — alat universal untuk berinteraksi dengan perangkat Android dari baris perintah. Melalui ADB Anda dapat menginstal aplikasi, memulai debugging, menyalin file, menjalankan perintah shell, dan melihat log. Android Studio menggunakan ADB di belakang layar untuk semua operasi debugging.

Menghubungkan debugger di Android Studio

Android Studio mendukung dua mode debugging: Run (menjalankan biasa) dan Debug (menjalankan dengan debugger terhubung). Dalam mode Debug, Anda dapat mengatur breakpoint langsung di editor, melihat variabel di Debug Tool Window, dan mengevaluasi ekspresi di Evaluate Expression. Untuk debugging proses latar belakang (Service, BroadcastReceiver), gunakan Attach Debugger to Android Process.

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

        // Breakpoint di sini akan menjeda eksekusi
        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 dan inspeksi database

Perintah ADB shell memberikan akses ke sistem file perangkat tanpa hak root. Anda dapat melihat isi direktori databases, menyalin file .db ke komputer, dan membukanya dengan klien SQLite apa pun. Android Studio Database Inspector mengotomatiskan proses ini: Anda melihat data database langsung secara real-time dan dapat menjalankan kueri SQL langsung dari IDE.

Debug di iOS: Xcode, debugger, dan diagnostik

Xcode menyediakan lingkungan debugging terintegrasi berbasis LLDB. Pengembang dapat menjalankan aplikasi di simulator atau perangkat fisik, mengatur breakpoint, dan menggunakan Debug Navigator untuk mengontrol aliran eksekusi. Tidak seperti Android, iOS tidak mengizinkan menjalankan dua build Debug secara bersamaan pada satu perangkat tanpa konfigurasi khusus.

Debugging di simulator dan di perangkat

Simulator menjalankan aplikasi sebagai proses macOS asli, yang memberikan siklus debugging tercepat. Pada perangkat fisik, debugging dilakukan melalui USB atau Wi-Fi (mulai iOS 16), dan LLDB berkomunikasi dengan debugserver di perangkat. Kinerja debugging pada perangkat lebih rendah karena bandwidth USB 2.0 yang terbatas, tetapi hanya perangkat fisik yang memungkinkan pengujian skenario nyata: notifikasi push, kamera, sensor.

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

Diagnostik dan laporan crash

Xcode Organizer mengumpulkan log crash dari perangkat penguji melalui Crash Logs. Untuk symbolication (konversi alamat menjadi nama fungsi), diperlukan file .dSYM yang dihasilkan pada setiap build Debug. Dalam build Release, dSYM juga dibuat, tetapi log crash dari App Store harus dimuat ke Organizer secara manual atau melalui layanan bitcode.

Pertanyaan yang Sering Diajukan

Bisakah build Debug dijalankan di perangkat pengguna?

Secara teknis ya — melalui Ad Hoc dengan sertifikat Debug, tetapi Apple dan Google tidak merekomendasikannya. Build Debug berisi simbol debugging dan kinerja yang lebih rendah, yang menurunkan UX dan meningkatkan ukuran aplikasi 2–3 kali lipat.

Mengapa build Debug lebih lambat dari Release?

Penyebabnya — optimalisasi compiler dinonaktifkan (-O0). Compiler tidak menyisipkan fungsi, tidak menghapus kode mati, dan menyimpan semua variabel perantara. Selain itu, Debug mengaktifkan pemeriksaan asersi dan batas array yang tidak ada di Release.

Bagaimana cara mengatur debugging Wi-Fi untuk iOS?

Di Xcode pilih Window → Devices and Simulators, centang “Connect via network” untuk perangkat Anda. Perangkat dan Mac harus berada di jaringan Wi-Fi yang sama. Setelah menghubungkan sekali melalui USB, debugging akan berfungsi melalui Wi-Fi pada peluncuran berikutnya.

Apa itu “attach to process” di Android Studio?

Attach to process memungkinkan menghubungkan debugger ke proses yang sudah berjalan tanpa memulai ulang aplikasi. Ini berguna untuk debugging Service, BroadcastReceiver, atau proses yang dimulai oleh peristiwa sistem, di mana Debug Run standar tidak berlaku.

Bagaimana cara melihat NSLog dan print di build Release?

NSLog dan print secara default hanya menampilkan log di konfigurasi Debug. Untuk Release, gunakan os_log dengan flag OSLogType.default — ia menyimpan pesan di Unified Logging System dan dapat diakses melalui Console.app di Mac.

Kesimpulan

  • Build Debug berisi simbol debugging, menonaktifkan optimalisasi, dan menggunakan sertifikat penandatanganan development
  • LLDB — debugger utama untuk kedua platform, mendukung breakpoint, watchpoint, dan REPL
  • Perbedaan Debug dan Release mencakup optimalisasi, simbol, penandatanganan, obfuskasi, dan ukuran build
  • ADB untuk Android dan debugserver untuk iOS memastikan komunikasi IDE dengan perangkat
  • Kinerja build Debug 2–5 kali lebih rendah karena optimalisasi yang dinonaktifkan
  • Log crash build Debug berisi nama fungsi yang dapat dibaca, Release memerlukan symbolication melalui dSYM

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga