Watchpoint — apa itu, jenis dan konfigurasi titik pengamatan di Xcode

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

Watchpoint (titik pengamatan) — mekanisme debug yang menghentikan eksekusi program saat nilai variabel atau area memori yang ditentukan berubah. Berbeda dengan breakpoint yang terikat pada baris kode, watchpoint melacak perubahan data terlepas dari bagian program mana yang melakukan modifikasi. Menurut Apple Developer Documentation, watchpoint sangat diperlukan saat men-debug race condition, perubahan properti yang tidak terduga, dan melacak siklus hidup objek.

Poin Utama

  • Watchpoint — titik pengamatan perubahan variabel yang dipicu setiap kali ada penulisan ke area memori yang ditentukan.
  • Xcode mendukung watchpoint melalui GUI dan konsol LLDB, termasuk titik pengamatan bersyarat.
  • Variabel properti objek memerlukan watchpoint dengan alamat memori, bukan nama variabel.
  • Kinerja dengan watchpoint menurun signifikan karena pemantauan perangkat keras setiap operasi penulisan.
  • Watchpoint tidak disimpan antar sesi debug — harus diatur ulang setelah setiap peluncuran.

Apa itu watchpoint dan prinsip kerja

Watchpoint — mekanisme debugger yang menghentikan eksekusi program saat nilai di alamat memori yang ditentukan berubah. Jika breakpoint bereaksi saat mencapai baris kode tertentu, watchpoint bereaksi saat penulisan ke sel memori tertentu — terlepas dari bagian kode mana yang melakukan penulisan tersebut. Ini membuatnya sangat diperlukan saat mencari modifikasi variabel yang tidak terduga, terutama dalam aplikasi multi-thread.

Prinsip kerja didasarkan pada dukungan perangkat keras prosesor. Chip ARM modern (Apple Silicon, Qualcomm Snapdragon) menyediakan 4 hingga 8 register watchpoint perangkat keras. Saat prosesor menjalankan instruksi penulisan di alamat yang sesuai dengan watchpoint, terjadi interupsi perangkat keras yang ditangkap oleh debugger. Jika register perangkat keras habis, LLDB beralih ke mode perangkat lunak — ia memeriksa setiap instruksi penulisan langkah demi langkah, yang memperlambat eksekusi puluhan kali lipat.

Menurut ARM Architecture Reference Manual, watchpoint perangkat keras bekerja di tingkat modul Data Watchpoint and Trace (DWT) dan tidak memerlukan modifikasi kode yang dapat dieksekusi. Waktu reaksi terhadap pemicuan adalah satuan nanodetik, yang memungkinkan pelacakan bahkan perubahan variabel frekuensi tinggi dalam loop pemrosesan data seperti buffer audio atau bingkai video.

Kapan watchpoint lebih efektif daripada breakpoint

Watchpoint sangat diperlukan saat Anda tahu variabel mana yang berubah, tetapi tidak tahu dari mana. Skenario umum: nilai properti frame di UIView berubah tanpa alasan yang jelas; penghitung di thread latar belakang mereset secara tidak terduga; bendera isLoading berubah sebelum permintaan jaringan selesai. Dalam setiap kasus ini, memasang breakpoint di semua tempat yang mungkin terjadi penulisan tidak praktis. Watchpoint memecahkan masalah dengan satu perintah.

Jenis watchpoint dan cara pemasangan

Xcode dan LLDB mendukung tiga jenis watchpoint: watchpoint set variable — untuk mengamati variabel lokal; watchpoint set expression — untuk mengamati ekspresi yang mengembalikan alamat; watchpoint set — untuk mengamati alamat memori mentah. Setiap jenis memiliki area penerapannya sendiri.

Jenis watchpointPerintah LLDBPenerapan
Variabelwatchpoint set variable -w write self.countVariabel lokal dan global, properti struktur
Ekspresiwatchpoint set expression -w write -- &self->mutex.lockBidang struktur melalui pointer, elemen array berdasarkan indeks
Alamatwatchpoint set -w write 0x600000c4b80Alamat memori spesifik dari keluaran LLDB sebelumnya

Pemasangan melalui GUI Xcode

Di Xcode, watchpoint dapat dipasang melalui Debug Area: berhenti di breakpoint, temukan variabel yang diinginkan di panel Variables View, klik kanan dan pilih Watch Variable. Xcode akan secara otomatis menjalankan perintah watchpoint set variable dengan nama variabel dan konteks yang benar. Setelah itu, debugger akan berhenti setiap kali nilai berubah — nyaman untuk debugging cepat tanpa beralih ke konsol. Namun, metode ini hanya berfungsi selama variabel berada dalam cakupan visibilitas bingkai saat ini.

swift
func processItems(_ items: [String]) {
    var index = 0
    // Atur watchpoint pada index melalui GUI:
    // berhenti di sini, klik kanan → Watch Variable
    for item in items {
        index += 1
        print("Item \(index): \(item)")
    }
}

Mengelola watchpoint melalui LLDB

LLDB menyediakan serangkaian perintah lengkap untuk mengelola watchpoint dari konsol. Ini memberikan kontrol lebih besar daripada GUI: Anda dapat menentukan ukuran area pengamatan, mengatur kondisi pemicuan, membuat watchpoint di alamat yang diperoleh dari ekspresi yang dihitung, dan secara otomatis menjalankan tindakan saat terpicu. Antarmuka baris perintah sangat berguna saat men-debug skenario kompleks yang memerlukan perubahan cepat parameter pengamatan.

Perintah watchpoint dasar

Perintah watchpoint set variable menerima nama variabel dengan mempertimbangkan cakupan visibilitas: untuk properti self di Objective-C gunakan self->_property, untuk Swift — self.property. Parameter -w write mengatur pelacakan penulisan, -w read — pembacaan (mode hanya tersedia di beberapa arsitektur), -s size — ukuran area dalam byte. Setelah memasang watchpoint, daftar dapat dilihat dengan perintah watchpoint list.

lldb
(lldb) watchpoint set variable -w write -s 8 self.balance
Watchpoint 1: addr = 0x600000c4b80 size = 8 state = enabled  type = w
    watchpoint spec: 'self.balance'
(lldb) watchpoint set expression -w write -- self->items._storage
Watchpoint 2: addr = 0x600003a4c00 size = 8
(lldb) watchpoint list
1: location = 0x600000c4b80, type = write, variable = '_balance'
2: location = 0x600003a4c00, type = write, expression = 'self->items._storage'

Watchpoint bersyarat

Seperti breakpoint, watchpoint mendukung pemicuan bersyarat. Parameter -c menetapkan kondisi dalam Swift atau Objective-C. Misalnya, watchpoint dengan kondisi newValue > 1000 akan berhenti hanya ketika nilai yang ditulis melebihi seribu. Ini sangat penting saat men-debug loop atau sensor yang menghasilkan ribuan perubahan per detik — jika tidak, debugger akan berhenti pada setiap perubahan, membuat pekerjaan tidak mungkin dilakukan.

lldb
(lldb) watchpoint set variable -w write self.temperature -c "(int)$newValue > 100"
Watchpoint 3: addr = 0x600000e4a20, condition = '(int)$newValue > 100'
(lldb) watchpoint modify 3 -C "po self.temperature" -G true
// Secara otomatis catat nilai dan lanjutkan eksekusi

Watchpoint untuk properti objek dan koleksi

Keunikan watchpoint untuk properti objek Objective-C dan Swift — watchpoint dipasang bukan pada nama properti, tetapi pada alamat bidang ivar (variabel instance) di memori objek. Ini berarti bahwa setiap kali objek dialokasikan baru (misalnya, saat ViewController dibuat ulang), watchpoint menjadi tidak valid karena alamat memori berubah. Untuk pengamatan properti secara terus-menerus selama restart, watchpoint harus dipasang ulang pada saat inisialisasi objek.

Watchpoint pada elemen koleksi

Pengamatan elemen array dan kamus memerlukan perhitungan alamat elemen spesifik. Misalnya, untuk mengamati elemen ketiga array, gunakan watchpoint set expression -- &array[2]. Jika array mengalokasikan ulang buffer internalnya (saat menambahkan elemen melebihi kapasitas), watchpoint menjadi tidak valid — LLDB akan melaporkan kesalahan Watchpoint 1 has an invalid address. Dalam kasus seperti itu, watchpoint harus dipasang ulang setelah ukuran koleksi berubah.

lldb
(lldb) expr var $arr = [10, 20, 30, 40, 50]
(lldb) watchpoint set expression -w write -- &$arr[2]
Watchpoint 4: addr = 0x1000a4b20, size = 8
(lldb) expr $arr[2] = 99
Watchpoint 4 hit: old value: 30, new value: 99

Melacak retain count melalui watchpoint

Di Objective-C, Anda dapat melacak retain count suatu objek dengan memasang watchpoint pada bidang retainCount di struktur objc_object. LLDB menjalankan ini melalui watchpoint set expression -w write -- (int*)[object retainCount]. Namun, untuk objek Swift dengan ARC (Automatic Reference Counting), retain count tidak dapat diakses secara langsung — sebagai gantinya, gunakan Instruments atau Memory Graph Debugger untuk analisis kebocoran memori. Menurut Apple, watchpoint pada retain count hanya berfungsi di build Debug dengan optimasi ARC dinonaktifkan.

Batasan dan kinerja watchpoint

Watchpoint memiliki sejumlah batasan yang perlu dipertimbangkan. Utama — jumlah watchpoint perangkat keras terbatas hingga 4–8 register pada arsitektur ARM dan hingga 4 pada x86. Ketika semua register perangkat keras terisi, LLDB beralih ke mode watchpoint perangkat lunak: memodifikasi setiap instruksi penulisan dalam rentang yang dilacak untuk menghasilkan pengecualian. Ini memperlambat eksekusi 10–50 kali lipat, oleh karena itu dalam praktiknya disarankan menggunakan tidak lebih dari 2–3 watchpoint aktif secara bersamaan.

Batasan kedua — ketidakvalidan watchpoint saat realokasi memori. Saat pengumpul sampah atau ARC bekerja, ketika objek dipindahkan di memori (dalam bahasa dengan kompaksi heap), alamat watchpoint menjadi tidak benar. Di Swift dan Objective-C, ARC tidak memindahkan objek, tetapi realokasi array dan string menyebabkan efek yang sama. LLDB memperingatkan tentang ini dengan pesan Watchpoint N address (0x...) doesn't contain a valid allocation.

Batasan ketiga — visibilitas variabel. Watchpoint pada variabel lokal hanya berfungsi selama variabel tersebut berada dalam cakupan visibilitas bingkai stack saat ini. Segera setelah fungsi selesai, watchpoint secara otomatis dihapus. Untuk pengamatan variabel global atau bidang objek berumur panjang, watchpoint dipertahankan hingga penghapusan eksplisit melalui watchpoint delete atau hingga proses berakhir.

lldb
(lldb) watchpoint delete 1
1 watchpoints deleted.
(lldb) watchpoint delete               # Hapus semua watchpoints
2 watchpoints deleted.
(lldb) watchpoint disable 1             # Nonaktifkan sementara
(lldb) watchpoint enable 1              # Aktifkan kembali

Menurut ARM, watchpoint di Apple Silicon (M1–M4) mendukung ukuran area yang dilacak dari 1 hingga 8 byte. Untuk mengamati struktur yang lebih besar dari 8 byte, diperlukan pemasangan beberapa watchpoint pada setiap bidang. Ini penting saat men-debug struktur data kompleks seperti CGRect (16 byte) atau UIEdgeInsets (16 byte).

Pertanyaan yang Sering Diajukan

Apa perbedaan antara watchpoint dan breakpoint?

Breakpoint terikat pada baris kode — berhenti saat baris tersebut tercapai. Watchpoint terikat pada alamat memori — berhenti saat ada penulisan ke alamat tersebut dari bagian program mana pun. Watchpoint mencari “siapa yang mengubah nilai”, breakpoint mencari “apa yang terjadi di baris ini”.

Berapa banyak watchpoint yang dapat dipasang secara bersamaan?

4–8 perangkat keras di ARM (termasuk Apple Silicon). Melebihi batas akan mengalihkan watchpoint ke mode perangkat lunak, yang memperlambat eksekusi 10–50 kali lipat. Disarankan tidak lebih dari 2–3 watchpoint aktif secara bersamaan.

Mengapa watchpoint berhenti bekerja setelah memulai ulang aplikasi?

Watchpoint tidak disimpan antar sesi debug. Setiap kali aplikasi dimulai ulang, alamat memori berubah dan watchpoint harus dipasang ulang. Pengecualian — watchpoint pada variabel global dengan alamat tetap.

Bisakah saya memasang watchpoint pada properti Swift?

Ya, tetapi watchpoint dipasang pada ivar (penyimpanan pendukung) properti, bukan pada properti itu sendiri. Di Swift, gunakan watchpoint set variable self.property — LLDB akan secara otomatis menemukan ivar yang sesuai berdasarkan nama properti.

Bagaimana watchpoint mempengaruhi kinerja aplikasi?

Perangkat keras watchpoint tidak mempengaruhi kinerja — interupsi terjadi di tingkat prosesor. Perangkat lunak (saat register perangkat keras habis) memperlambat eksekusi 10–50 kali lipat karena LLDB memeriksa setiap instruksi penulisan.

Ringkasan

  • Watchpoint — titik pengamatan perubahan memori yang dipicu setiap kali ada penulisan ke alamat yang ditentukan dari thread mana pun.
  • Perangkat keras watchpoint menggunakan register DWT prosesor dan tidak memperlambat eksekusi, tetapi terbatas pada 4–8 register.
  • LLDB mendukung tiga jenis watchpoint: pada variabel, pada ekspresi, dan pada alamat memori mentah.
  • Bersyarat watchpoint hanya terpicu saat ekspresi yang ditentukan terpenuhi — diperlukan untuk men-debug perubahan frekuensi tinggi.
  • Watchpoint pada properti objek dan elemen koleksi menjadi tidak valid saat realokasi memori.
  • Watchpoint tidak disimpan antar sesi dan dihapus saat variabel keluar dari cakupan visibilitas.
  • Watchpoint — pilihan terbaik saat variabel diketahui tetapi lokasi perubahannya tidak diketahui, terutama dalam kode multi-thread.

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