Kesme noktası (breakpoint), kodda, ulaşıldığında hata ayıklayıcının program yürütmeyi durum incelemesi için duraklattığı özel bir işarettir. Apple Debugging Guide'a göre breakpoint'ler, geliştiricinin kaynak kodunu değiştirmeden değişken değerlerini, çağrı yığınını görüntülemesine ve adım adım yürütme yapmasına olanak tanır. Bu, gerçek zamanlı olarak hataları teşhis etmek ve uygulama davranışını analiz etmek için ana araçtır.
Önemli Noktalar
Breakpoint, kaynak kodun belirli bir satırına yerleştirilen etkin bir işarettir; bu satıra ulaşıldığında hata ayıklayıcı, iş parçacığı yürütmesini zorla durdurur. Bu anda, geliştirici uygulama durumu üzerinde tam kontrol elde eder: geçerli kapsamdaki tüm değişkenlerin değerlerini görebilir, çağrı yığınını inceleyebilir, rastgele ifadeler yürütebilir ve yürütmeye adım adım devam edebilir. Breakpoint'ler olmadan, hata ayıklama sonsuz geçici print ifadeleri ekleyip sonra silmekten ibaret olurdu — kodu kirleten ve etkileşimli kontrol sağlamayan bir yaklaşım.
Bir breakpoint'in temel amacı, hatanın kaynağını bulmaktır. Bir uygulama beklenmedik şekilde davrandığında, geliştirici şüpheli bölümden önce bir kesme noktası koyar ve hangi verilerin girdiğini, değişkenlerin nasıl değiştiğini ve yürütmenin hangi yolu izlediğini sırayla analiz eder. Apple'a göre, mobil uygulamalardaki hataların %70'inden fazlası, statik kod analizi yerine breakpoint'ler ve adım adım yürütme kombinasyonuyla kesin olarak belirlenir.
Breakpoint'ler sürüm yapılarının performansını etkilemez — yalnızca Debug yapılandırmasında derlenirler. Xcode, hata ayıklama kodunu ön işlemci yönergeleriyle saran özel bir DEBUG bayrağına sahiptir. Bu, breakpoint'lerin App Store'a girmemesini ve son kullanıcıları yavaşlatmamasını sağlar.
İşlemci, breakpoint ile işaretlenmiş bir satıra ulaştığında, bir donanım veya yazılım kesintisi oluşur. Xcode'da SIGTRAP mekanizması kullanılır — hata ayıklayıcı tarafından yakalanan bir izleme sinyali. LLDB tüm iş parçacıklarını askıya alır, kontrolü Xcode arayüzüne verir ve geliştiricinin komutunu bekler: devam et (continue), adım atla (step over), içine gir (step into) veya dışarı çık (step out).
func fetchUserData(userId: Int) {
// LLDB will stop here if breakpoint is set
let url = URL(string: "https://api.example.com/user/\(userId)")
var request = URLRequest(url: url)
request.httpMethod = "GET"
print("Fetching user \(userId)")
}
Yukarıdaki örnekte, let url = ... satırına yerleştirilen breakpoint, işleve hangi userId'nin iletildiğini, URL'nin doğru şekilde oluşturulup oluşturulmadığını ve ağ çağrısı yürütülmeden önce istekte hangi başlıkların ayarlandığını kontrol etmeye olanak tanır.
Xcode, her biri belirli bir hata ayıklama görevini çözen beş ana breakpoint türü sağlar. Farklılıklarını anlamak, her durum için en uygun aracı seçmeye ve yalnızca çizgisel kesme noktaları kullanmaya kıyasla teşhis süresini 2–3 kat azaltmaya olanak tanır.
| Breakpoint Türü | Amaç | Etkinleştirme |
|---|---|---|
| Line breakpoint | Belirli bir kod satırında durma | Düzenleyicide satır numarasına tıklayın |
| Conditional breakpoint | Bir koşul karşılandığında durma | Sağ tık → Edit Breakpoint → Condition |
| Symbolic breakpoint | Bir işlev/yöntem çağrıldığında durma | Breakpoint Navigator → + → Symbolic Breakpoint |
| Exception breakpoint | Bir istisna fırlatıldığında durma | Breakpoint Navigator → + → Exception Breakpoint |
| Error breakpoint | Bir hata oluştuğunda durma (Swift) | Breakpoint Navigator → + → Swift Error Breakpoint |
Line breakpoint en yaygın türdür. Xcode düzenleyicisinde satır numarasına tek bir tıklamayla ayarlanır. Bu satıra ulaşıldığında yürütme duraklatılır ve geliştirici, Debug Area paneli veya LLDB konsolu aracılığıyla durumu inceleyebilir. Stack Overflow istatistiklerine göre, iOS geliştiricilerinin %85'inden fazlası çizgisel breakpoint'leri birincil hata ayıklama aracı olarak kullanırken, diğer türler üçüncü taraf kitaplıklarında hata ayıklama veya istisnaları yakalama gibi belirli senaryolar için kullanılır.
Symbolic breakpoint, belirli bir yöntem veya işlev çağrıldığında, o yöntemin kaynak koduna erişiminiz olmasa bile durmanızı sağlar. Sistem çerçevelerinde hata ayıklarken bu paha biçilmezdir — örneğin, UIKit'in layoutSubviews'i çağırdığı anı yakalamak için. Yapılandırma, sembol adını (ör. Objective-C için -[UIView layoutSubviews] veya Swift için UIView.layoutSubviews()) ve isteğe bağlı parametreleri içerir: modül, koşul ve yoksayma sayısı.
// Symbolic breakpoint to intercept layoutSubviews on UITableView
// Symbol name: -[UITableView layoutSubviews]
// Action: po UITableView.appearance()
class CustomTableView: UITableView {
override func layoutSubviews() {
super.layoutSubviews()
// Symbolic breakpoint here will intercept the call
print("layoutSubviews called")
}
}
Koşullu breakpoint, satırın her yürütülmesinde değil, yalnızca belirtilen mantıksal ifade true olarak değerlendirildiğinde tetiklenir. Bu, döngülerde, dizi işlemede ve özyinelemeli çağrılarda hata ayıklarken büyük zaman tasarrufu sağlar — her seferinde manuel olarak Continue tıklamak yerine, geliştirici bir koşul belirler ve hata ayıklayıcı yalnızca ilgili anda durur.
Koşul eklemek için breakpoint'e sağ tıklayın, Edit Breakpoint'i seçin ve Condition alanına Swift veya Objective-C cinsinden bir ifade girin. Karşılaştırmalar, mantıksal operatörler ve yan etkisi olmayan yöntem çağrılarına izin verilir. Xcode, durdurulan program bağlamında ifadeyi değerlendirir ve doğruysa hata ayıklayıcı durumu yakalar.
for index in 0..<1000 {
// Breakpoint with condition: index == 500
// The debugger will stop only on the 501st iteration
processItem(at: index)
}
Bir koşula ek olarak, breakpoint programı durdurmadan otomatik eylemler gerçekleştirebilir. Bu, breakpoint ayarlarındaki Automatically continue after evaluating seçeneği aracılığıyla uygulanır. Eylemler şunları içerir: konsola değer çıktısı (po variable), ses sinyali çalma, rastgele bir LLDB komutu yürütme veya shell betiği çalıştırma. Bu yaklaşım, geçici print ifadelerinin yerini alır ve kaynak kodunu değiştirmeden veri kaydetmeye olanak tanır.
// Breakpoint with action: po “Index: \(index), value: \(items[index])”
// Automatically continue = true → program does not stop
func processItems(_ items: [String]) {
for (index, item) in items.enumerated() {
// Here the breakpoint logs every iteration without stopping
print("Processing \(item)")
}
}
Bu teknik özellikle UI güncellemelerinde hata ayıklarken kullanışlıdır — örneğin, denetleyici koduna müdahale etmeden tüm çerçeve değişikliklerini kaydetmek için. Ray Wenderlich'e göre, geçici print ifadeleri yerine breakpoint eylemleri kullanmak, sonrasında kodu temizleme gereği olmadığından hata ayıklama süresini %30–40 oranında azaltır.
Xcode kullanışlı bir grafik arayüz sağlasa da, LLDB hata ayıklayıcı konsolundan doğrudan kesme noktalarının programatik yönetimi için düzinelerce komutu destekler. Bu, GUI aracılığıyla kullanılamayan yetenekler sunar: düzenli ifadelerle toplu breakpoint devre dışı bırakma, dinamik olarak yüklenen kitaplıklarda kesme noktaları ayarlama ve karmaşık çok adımlı tetikleyiciler oluşturma.
| LLDB Komutu | Açıklama | Örnek |
|---|---|---|
| breakpoint set | Breakpoint ayarlama | breakpoint set -f ViewController.swift -l 42 |
| breakpoint list | Tüm breakpoint'leri gösterme | breakpoint list |
| breakpoint disable | Numaraya göre breakpoint devre dışı bırakma | breakpoint disable 1 |
| breakpoint delete | Breakpoint silme | breakpoint delete 1.2 |
| breakpoint modify | Koşul veya eylem değiştirme | 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, işlev adları için düzenli ifadelerle breakpoint ayarlamayı destekler. Bu, bir kalıpla eşleşen tüm yöntemleri yakalamaya olanak tanır — örneğin, belirli bir sınıfta handle ile başlayan tüm yöntemler. Bu yaklaşım, yeniden düzenleme sırasında ve belirli bir olayın işlenmesinde hangi yöntemlerin yer aldığını anlamanız gerektiğinde bilinmeyen kod analizinde kullanılır.
(lldb) breakpoint set -r "handle[A-Z]" -s DataManager
Breakpoint 2: 6 locations.
(lldb) breakpoint set -r ".*Error.*"
Breakpoint 3: 23 locations.
Exception breakpoint, herhangi bir istisna fırlatıldığında program yürütmeyi durdurur — hem Objective-C hem de Swift hataları. Xcode'da yalnızca Objective-C istisnalarını, yalnızca Swift hatalarını veya tüm türleri yakalayacak şekilde yapılandırabilirsiniz. Bu, uygulama kodda net bir konum belirtmeden çöktüğünde vazgeçilmez bir araçtır — örneğin, serbest bırakılmış bir nesneye erişirken.
Swift Error Breakpoint, Xcode 11'de tanıtılan özelleştirilmiş bir türdür. Bir Swift işlevinin throw aracılığıyla bir hata fırlattığı anı, catch bloğuna ulaşmadan önce yakalar. Bu, hangi işlevin hangi argümanlarla hatayı oluşturduğunu görmeyi sağlar; birden çok hata işleme düzeyine sahip karmaşık çağrı zincirlerinde hata ayıklarken kritiktir.
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 will stop here on throw
return UserProfile(id: id, name: "Test")
}
Sembolik breakpoint'ler KVO ve NotificationCenter hata ayıklarken de etkilidir. observeValue(forKeyPath:of:change:context:) üzerinde bir breakpoint ayarlayarak geliştirici, uygulamadaki tüm KVO bildirimlerini yakalayabilir; bu, beklenmeyen UI güncellemelerini veya özellik gözlemiyle ilgili yarış koşullarını teşhis etmeye yardımcı olur.
Breakpoint'lerin etkili kullanımı, yalnızca bir satırda durmanın çok ötesine geçer. Deneyimli geliştiriciler, breakpoint türlerini LLDB betikleri, geçici durma bölgeleri ve tekrarlanabilir hata ayıklama için yapılandırma dışa aktarma ile birleştirir. Apple ve Google mühendislerinin pratiğiyle desteklenen en kullanışlı tekniklere bakalım.
Yakalanması zor hatalarda hata ayıklarken, yöntem girişinde bir breakpoint ve anahtar değişkendeki değişiklikte bir watchpoint kombinasyonunu kullanın. Atamadan önce bir çizgisel breakpoint ayarlayın, ardından LLDB komutu watchpoint set variable ile değişkende bir watchpoint oluşturun. Değer değiştiğinde, değişiklik kodun neresinde olursa olsun hata ayıklayıcı duracaktır. Google'a göre bu yaklaşım, tek bir hata ayıklama oturumunda vakaların %90'ında bir veri yarışının kaynağını bulabilir.
(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, Breakpoint Navigator aracılığıyla breakpoint'leri gruplamanıza olanak tanır. Her senaryo için ayrı bir grup oluşturun — örneğin, “giriş”, “satın alma”, “ağ hataları”. Belirli bir işlevselliği test ederken, yalnızca ilgili grubu etkinleştirin, diğerlerini devre dışı bırakın. Bu, yanlış tetiklemeleri önler ve breakpoint sayısının birkaç düzineyi aşabileceği büyük projelerde hata ayıklamayı hızlandırır. Bir grubu dosyaya dışa aktarmak, yapılandırmayı sürüm kontrolü aracılığıyla meslektaşlarınızla paylaşmanıza olanak tanır.
Karmaşık senaryolar için LLDB, bir breakpoint tetiklendiğinde Python betiklerinin yürütülmesini destekler. Breakpoint eyleminde script import my_debug_helper; my_debug_helper.log_state() belirtin. Bu, sınırsız olanaklar sunar: otomatik istatistik toplama, çağrılar arasında durum karşılaştırma, hata ayıklama kapsamı raporları oluşturma. Apple'a göre LLDB Python API'si, CI testleri sırasında otomatik çökme analizi için Xcode Cloud'da kullanılır.
Sıkça Sorulan Sorular
Etkin olmayan breakpoint'ler performansı etkilemez — yalnızca Debug yapılandırmasında derlenirler. Etkin kesme noktaları donanım kesintisi mekanizması nedeniyle yürütmeyi yavaşlatır, ancak yalnızca hata ayıklama sırasında.
Evet, yöntem veya işlev adına göre Symbolic breakpoint aracılığıyla. Kaynak kod mevcut olmasa bile LLDB, sembol çağrıldığında duracaktır. Ek olarak, adım adım gezinme için LLDB sökücü kullanılabilir.
Step Over geçerli satırı tamamen (işlev çağrıları dahil) yürütür ve sonraki satırda durur. Step Into çağrılan işlevin içine girer ve adım adım hata ayıklamaya olanak tanır. Step Out kontrolü çağırana geri verir.
Breakpoint'ler otomatik olarak proje içindeki xcuserdata içinde kaydedilir. Meslektaşlarla paylaşmak için Breakpoint Navigator → Share aracılığıyla dışa aktarmayı kullanın. .xcbkptlist dosyası, hata ayıklama ekip çalışmasıysa depoya eklenebilir.
Yapının Debug yapılandırmasını, breakpoint etkinliğini (mavi simge), sembolik breakpoint'ler için sembolün doğruluğunu ve kaynak kodun yürütülebilir ikili dosyayla eşleştiğini kontrol edin — genellikle Clean Build Folder yardımcı olur.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun