Titik henti (breakpoint) — tanda khusus dalam kode yang ketika dicapai, debugger menghentikan eksekusi program untuk inspeksi keadaan. Menurut Apple Debugging Guide, breakpoint memungkinkan pengembang melihat nilai variabel, tumpukan panggilan, dan melakukan eksekusi langkah demi langkah tanpa mengubah kode sumber. Ini adalah alat utama untuk diagnosa kesalahan dan analisis perilaku aplikasi secara real-time.
Poin Utama
Breakpoint — adalah tanda aktif yang ditempatkan pada baris tertentu dari kode sumber, yang ketika dicapai, debugger secara paksa menghentikan eksekusi thread. Pada saat itu, pengembang mendapatkan kendali penuh atas keadaan aplikasi: dapat melihat nilai semua variabel dalam cakupan saat ini, memeriksa tumpukan panggilan, menjalankan ekspresi arbitrer, dan melanjutkan eksekusi langkah demi langkah. Tanpa breakpoint, debugging akan menjadi penambahan ekspresi print sementara yang tak berujung dengan penghapusan berikutnya — pendekatan yang mengotori kode dan tidak memberikan kontrol interaktif.
Tujuan utama breakpoint — melokalisasi sumber kesalahan. Ketika aplikasi berperilaku tidak terduga, pengembang menempatkan titik henti di depan bagian yang mencurigakan dan secara berurutan menganalisis data apa yang masuk, bagaimana variabel berubah, dan jalur mana yang diambil eksekusi. Menurut Apple, lebih dari 70% kesalahan dalam aplikasi mobile terdeteksi justru dengan breakpoint yang dikombinasikan dengan eksekusi langkah demi langkah, bukan dengan analisis kode statis.
Breakpoint tidak memengaruhi kinerja build rilis — mereka hanya dikompilasi dalam Konfigurasi Debug. Di Xcode terdapat flag khusus DEBUG yang membungkus kode debugging dengan direktif preprocessor. Ini menjamin bahwa titik henti tidak akan masuk ke App Store dan tidak akan memperlambat kerja pengguna akhir.
Ketika prosesor mencapai baris yang ditandai dengan breakpoint, terjadi interupsi perangkat keras atau perangkat lunak. Di Xcode digunakan mekanisme SIGTRAP — sinyal pelacakan yang ditangkap oleh debugger. LLDB menghentikan semua thread, menyerahkan kendali ke antarmuka Xcode, dan menunggu perintah pengembang: lanjutkan (continue), lewati (step over), masuki (step into), atau keluar (step out).
func fetchUserData(userId: Int) {
// LLDB akan berhenti di sini jika breakpoint dipasang
let url = URL(string: "https://api.example.com/user/\(userId)")
var request = URLRequest(url: url)
request.httpMethod = "GET"
print("Fetching user \(userId)")
}
Dalam contoh di atas, breakpoint yang ditempatkan pada baris let url = ..., memungkinkan pengecekan userId mana yang diteruskan ke fungsi, apakah URL tersusun dengan benar, dan header apa yang diatur dalam permintaan, sebelum panggilan jaringan dieksekusi.
Xcode menyediakan lima jenis breakpoint dasar, yang masing-masing menyelesaikan tugas debugging spesifik. Memahami perbedaan mereka memungkinkan pemilihan alat optimal untuk setiap situasi dan mempercepat waktu diagnosis 2–3 kali lipat dibandingkan hanya menggunakan titik henti linear.
| Jenis Breakpoint | Tujuan | Aktivasi |
|---|---|---|
| Line breakpoint | Berhenti pada baris kode tertentu | Klik nomor baris di editor |
| Conditional breakpoint | Berhenti ketika kondisi terpenuhi | Klik kanan → Edit Breakpoint → Condition |
| Symbolic breakpoint | Berhenti saat pemanggilan fungsi/metode | Breakpoint Navigator → + → Symbolic Breakpoint |
| Exception breakpoint | Berhenti saat pengecualian dilempar | Breakpoint Navigator → + → Exception Breakpoint |
| Error breakpoint | Berhenti saat terjadi kesalahan (Swift) | Breakpoint Navigator → + → Swift Error Breakpoint |
Line breakpoint — jenis paling umum. Dipasang dengan satu klik pada nomor baris di editor Xcode. Ketika baris ini tercapai, eksekusi berhenti dan pengembang dapat memeriksa keadaan melalui panel Debug Area atau konsol LLDB. Menurut statistik Stack Overflow, lebih dari 85% pengembang iOS menggunakan breakpoint linear sebagai alat debugging utama, dan tipe lainnya untuk skenario spesifik seperti debugging pustaka pihak ketiga atau menangkap pengecualian.
Symbolic breakpoint memungkinkan berhenti saat pemanggilan metode atau fungsi tertentu, bahkan jika Anda tidak memiliki akses ke kode sumber metode tersebut. Ini sangat diperlukan saat debugging framework sistem — misalnya, untuk menangkap momen ketika UIKit memanggil layoutSubviews. Konfigurasi mencakup nama simbol (misalnya, -[UIView layoutSubviews] untuk Objective-C atau UIView.layoutSubviews() untuk Swift) dan parameter opsional: modul, kondisi, dan jumlah lompatan.
// Symbolic breakpoint untuk menangkap layoutSubviews di UITableView
// Nama simbol: -[UITableView layoutSubviews]
// Tindakan: po UITableView.appearance()
class CustomTableView: UITableView {
override func layoutSubviews() {
super.layoutSubviews()
// Symbolic breakpoint akan menangkap panggilan di sini
print("layoutSubviews called")
}
}
Breakpoint bersyarat tidak terpicu setiap kali baris tercapai, tetapi hanya ketika ekspresi logika yang diberikan memiliki nilai true. Ini menghemat banyak waktu saat debugging loop, pemrosesan array, dan panggilan rekursif — alih-alih menekan Continue secara manual setiap saat, pengembang menetapkan kondisi dan debugger berhenti hanya pada momen yang diperlukan.
Untuk menambahkan kondisi, klik kanan pada breakpoint, pilih Edit Breakpoint dan di bidang Condition masukkan ekspresi dalam Swift atau Objective-C. Perbandingan, operator logika, dan pemanggilan metode tanpa efek samping diperbolehkan. Xcode akan mengevaluasi ekspresi dalam konteks program yang dihentikan, dan jika benar — debugger akan mencatat keadaan.
for index in 0..<1000 {
// Breakpoint dengan kondisi: index == 500
// Debugger hanya akan berhenti pada iterasi ke-501
processItem(at: index)
}
Selain kondisi, breakpoint dapat menjalankan tindakan otomatis tanpa menghentikan program. Ini diimplementasikan melalui opsi Automatically continue after evaluating di pengaturan breakpoint. Tindakan meliputi: mencetak nilai ke konsol (po variable), memainkan sinyal suara, menjalankan perintah LLDB arbitrer, atau menjalankan skrip shell. Pendekatan ini menggantikan print sementara dan memungkinkan pencatatan data tanpa mengubah kode sumber.
// Breakpoint dengan tindakan: po “Index: \(index), value: \(items[index])”
// Automatically continue = true → program tidak berhenti
func processItems(_ items: [String]) {
for (index, item) in items.enumerated() {
// Di sini breakpoint mencatat setiap iterasi tanpa berhenti
print("Processing \(item)")
}
}
Teknik ini sangat berguna saat debugging pembaruan UI — misalnya, untuk mencatat semua perubahan bingkai tanpa campur tangan dalam kode kontroler. Menurut Ray Wenderlich, menggunakan tindakan breakpoint alih-alih ekspresi print sementara mengurangi waktu debugging sebesar 30–40% karena tidak perlu membersihkan kode setelah selesai.
Meskipun Xcode menyediakan antarmuka grafis yang nyaman, LLDB mendukung puluhan perintah untuk manajemen titik henti secara terprogram langsung dari konsol debugger. Ini memberikan kemampuan yang tidak tersedia melalui GUI: menonaktifkan breakpoint secara massal berdasarkan ekspresi reguler, menempatkan titik henti di pustaka yang dimuat secara dinamis, dan membuat pemicu multi-langkah yang kompleks.
| Perintah LLDB | Deskripsi | Contoh |
|---|---|---|
| breakpoint set | Memasang breakpoint | breakpoint set -f ViewController.swift -l 42 |
| breakpoint list | Menampilkan semua breakpoint | breakpoint list |
| breakpoint disable | Menonaktifkan breakpoint berdasarkan nomor | breakpoint disable 1 |
| breakpoint delete | Menghapus breakpoint | breakpoint delete 1.2 |
| breakpoint modify | Mengubah kondisi atau tindakan | breakpoint modify -c "i > 100" 1 |
(lldb) breakpoint set -f LoginViewController.swift -l 15 -c "email.isEmpty"
Breakpoint 1: 15 locations added.
(lldb) breakpoint modify 1 -C "po email" -G true
(lldb) breakpoint list
1: name = 'LoginViewController.swift:15', condition = 'email.isEmpty'
1.1: addr = 0x1000a3b40
LLDB mendukung pemasangan breakpoint berdasarkan ekspresi reguler untuk nama fungsi. Ini memungkinkan menangkap semua metode yang cocok dengan pola — misalnya, semua metode yang dimulai dengan handle di kelas tertentu. Pendekatan ini digunakan saat refactoring dan analisis kode yang tidak dikenal, ketika perlu memahami metode mana yang terlibat dalam pemrosesan peristiwa tertentu.
(lldb) breakpoint set -r "handle[A-Z]" -s DataManager
Breakpoint 2: 6 locations.
(lldb) breakpoint set -r ".*Error.*"
Breakpoint 3: 23 locations.
Exception breakpoint menghentikan eksekusi program saat pengecualian dilempar — baik kesalahan Objective-C maupun Swift. Di Xcode dapat diatur untuk menangkap hanya pengecualian Objective-C, hanya kesalahan Swift, atau semua jenis. Ini adalah alat yang sangat diperlukan ketika aplikasi crash tanpa indikasi lokasi yang jelas dalam kode — misalnya, saat mengakses objek yang sudah dibebaskan.
Swift Error Breakpoint — tipe khusus yang muncul di Xcode 11. Ia menangkap momen ketika fungsi Swift melempar kesalahan melalui throw, sebelum masuk ke blok catch. Ini memungkinkan melihat fungsi mana yang menghasilkan kesalahan dan dengan argumen apa, yang sangat penting saat debugging rantai panggilan kompleks dengan beberapa tingkat penanganan kesalahan.
enum NetworkError: Error {
case invalidURL
case noData
case decodingFailed(String)
}
func loadUserProfile(id: Int) throws -> UserProfile {
guard id > 0 else {
throw NetworkError.invalidURL
}
// Swift Error Breakpoint akan berhenti di sini saat throw
return UserProfile(id: id, name: "Test")
}
Breakpoint simbolis juga efektif saat debugging KVO dan NotificationCenter. Dengan memasang breakpoint pada observeValue(forKeyPath:of:change:context:), pengembang dapat menangkap semua notifikasi KVO dalam aplikasi, yang membantu mendiagnosis pembaruan UI yang tidak terduga atau race condition terkait pengamatan properti.
Penggunaan breakpoint yang efektif melampaui sekadar berhenti pada baris. Pengembang berpengalaman menggabungkan jenis titik henti dengan skrip LLDB, zona penghentian sementara, dan ekspor konfigurasi untuk debugging yang dapat direproduksi. Mari kita lihat teknik paling berguna yang dikonfirmasi oleh praktik insinyur Apple dan Google.
Saat debugging bug yang sulit ditemukan, gunakan kombinasi breakpoint di awal metode dan watchpoint pada perubahan variabel kunci. Pasang breakpoint linear sebelum penugasan, lalu buat watchpoint pada variabel melalui perintah LLDB watchpoint set variable. Ketika nilai berubah, debugger akan berhenti terlepas dari bagian kode mana modifikasi terjadi. Menurut Google, pendekatan ini memungkinkan menemukan sumber data race dalam 90% kasus dalam satu sesi debugging.
(lldb) watchpoint set variable self->_balance
Watchpoint 1: addr = 0x600000c4b80 size = 8
state = enabled type = w
watchpoint spec: 'self._balance'
(lldb) watchpoint list
1: location = 0x600000c4b80, type = write, variable = '_balance'
Xcode memungkinkan mengelompokkan breakpoint melalui Breakpoint Navigator. Buat grup terpisah untuk setiap skenario — misalnya, “login”, “pembelian”, “kesalahan jaringan”. Saat menguji fungsionalitas tertentu, aktifkan hanya grup yang sesuai, nonaktifkan yang lain. Ini mencegah pemicuan palsu dan mempercepat debugging di proyek besar di mana jumlah titik henti bisa mencapai puluhan. Ekspor grup ke file memungkinkan berbagi konfigurasi dengan rekan kerja melalui sistem kontrol versi.
Untuk skenario kompleks, LLDB mendukung eksekusi skrip Python saat breakpoint terpicu. Di tindakan breakpoint, tentukan script import my_debug_helper; my_debug_helper.log_state(). Ini membuka kemungkinan tak terbatas: pengumpulan statistik otomatis, perbandingan keadaan antar panggilan, pembuatan laporan cakupan kode debugging. Menurut Apple, LLDB Python API digunakan di Xcode Cloud untuk analisis crash otomatis selama pengujian CI.
Pertanyaan Umum
Breakpoint tidak aktif tidak memengaruhi kinerja — mereka hanya dikompilasi dalam konfigurasi Debug. Titik henti aktif memperlambat eksekusi karena mekanisme interupsi perangkat keras, tetapi hanya selama debugging.
Ya, melalui Symbolic breakpoint berdasarkan nama metode atau fungsi. LLDB akan berhenti saat pemanggilan simbol, bahkan jika kode sumber tidak tersedia. Selain itu, disassembler LLDB dapat digunakan untuk eksekusi langkah demi langkah.
Step Over mengeksekusi baris saat ini sepenuhnya (termasuk panggilan fungsi) dan berhenti di baris berikutnya. Step Into masuk ke dalam fungsi yang dipanggil, memungkinkan debugging langkah demi langkah. Step Out mengembalikan kendali ke pemanggil.
Breakpoint secara otomatis disimpan di xcuserdata dalam proyek. Untuk berbagi dengan rekan kerja, gunakan ekspor melalui Breakpoint Navigator → Share. File .xcbkptlist dapat ditambahkan ke repositori jika debugging bersifat tim.
Periksa konfigurasi Debug build, aktivitas breakpoint (ikon biru), kebenaran simbol untuk symbolic breakpoint, dan kesesuaian kode sumber dengan biner yang dapat dieksekusi — seringkali Clean Build Folder membantu.
Ringkasan
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.
Baca juga