Debug (hata ayıklama modu) — derleyicinin sembolik bilgi eklediği, kod optimizasyonunu devre dışı bıraktığı ve adım adım yürütme analizi için hata ayıklayıcıyı bağladığı bir mobil uygulama derleme yapılandırmasıdır. Android Developers'a göre, Debug derlemesi hata ayıklama sembolleri içerir, kaynakları sıkıştırmaz ve veritabanı ile ağ isteği denetleyicisini bağlamaya izin verir. Debug modu Release derlemesinin karşıtıdır: Debug'da geliştirici, kod yürütme şeffaflığı için performanstan ödün verir.
Anahtar Noktalar
Debug yalnızca bir derleyici bayrağı değil, uygulamayı geliştirici için şeffaf hale getiren eksiksiz bir ayarlar kümesidir. Debug modunda derleyici, yürütülebilir dosyaya makine kodunu kaynak satırlarına bağlayan bir sembol adı tablosu (DWARF) ekler. Bu tablo olmadan, hata ayıklayıcı o anda hangi kod satırının yürütüldüğünü gösteremez.
Hata ayıklayıcı (debugger), uygulamanızı kontrollü bir ortamda çalıştıran bir programdır. Herhangi bir satırda yürütmeyi duraklatabilir (kesme noktası), geçerli kapsamdaki tüm değişkenlerin değerlerini görebilir, bunları anında değiştirebilir ve yürütmeye devam edebilirsiniz. Mobil platformlar için standart hata ayıklayıcı LLDB'dir — hem Xcode hem de Android Studio'da kullanılan bir LLVM bileşeni.
Debug modu ayrıca Release'de devre dışı bırakılan ek kontrolleri de içerir: iddialar (assertions), dizi sınır kontrolleri, bellek sızıntısı dedektörleri ve genişletilmiş günlük kaydı. Bu kontroller uygulamayı yavaşlatır ancak geliştirmenin erken aşamalarında hataları yakalar — kod kullanıcıya ulaşmadan önce.
Debug ve Release derlemeleri arasındaki fark temeldir: bunlar iki farklı derleyici bayrağı, imzalama yapılandırması ve paketleme ayarı kümesidir. Bu farkları anlamak, “simülatörde çalışıyor ancak gerçek cihazda çalışmıyor” durumlarından kaçınmaya yardımcı olur.
| Parametre | Debug | Release |
|---|---|---|
| Optimizasyon | Devre dışı (-O0) | Etkin (-Os veya -O2) |
| Semboller | Tam DWARF tablosu | Kaldırıldı |
| İmzalama | Geliştirme sertifikası | Dağıtım sertifikası |
| Profiller | Debug sağlama profili | App Store / Ad Hoc profili |
| Günlük kaydı | Tam (tüm seviyeler) | Devre dışı veya minimum |
| Karartma | Devre dışı | Etkin (ProGuard/R8) |
| .apk/.ipa boyutu | Daha büyük (semboller + sıkıştırma yok) | Daha küçük (R8 + kaynaklar) |
Debug derlemesi geliştirmenin tüm aşamalarında ve yerel cihazlarda test etmede kullanılır. Release derlemesi App Store Connect veya Google Play Console'a göndermeden önce oluşturulur. Release derlemesinde hata ayıklama teknik olarak mümkündür ancak yeniden adlandırılmış yöntemler (R8) ve kilitlenme günlükleri için symbolication eksikliği nedeniyle son derece elverişsizdir.
Yaygın bir sorun, Debug'da çalışan ancak Release'de çöken koddur. Bunun nedeni, derleyicinin farklı optimizasyon seviyelerinde farklı şekilde işlediği koddaki UB'dir (tanımsız davranış). Tipik bir örnek: başlatılmamış bir değişkeni okumak veya strict aliasing'i ihlal etmek. Bu tür hataları tespit etmek için her Release derlemesinden önce statik bir analizör (Clang Static Analyzer, ktlint) kullanın.
LLDB, C, C++, Objective-C, Swift ve Kotlin/Native'i destekleyen, LLVM tabanlı yüksek performanslı bir hata ayıklayıcıdır. LLDB, duraklatılmış bir uygulama bağlamında rastgele ifadeler yürütebileceğiniz, değişken değerlerini değiştirebileceğiniz ve işlevleri çağırabileceğiniz bir REPL arayüzü sağlar.
Kesme noktası hata ayıklayıcının temel aracıdır. Bir kod satırına bir nokta koyarsınız ve yürütme o satıra ulaştığında uygulama duraklar. LLDB birkaç tür kesme noktasını destekler: koşullu (yalnızca bir koşul karşılandığında tetiklenir), sembolik (işlev çağrısında) ve tek kullanımlık (bir kez tetiklenir ve otomatik olarak kaldırılır).
İzleme noktası değişken değişikliklerini gözlemleme noktasıdır. Bir bellek adresi belirtirsiniz ve hata ayıklayıcı bu adrese yapılan her yazmada yürütmeyi duraklatır. Bu araç, veri yarışlarını ve paylaşılan nesnelerin yanlış mutasyonlarını bulmak için vazgeçilmezdir. UIKit hiyerarşisini görüntülemek için Xcode'da bulunan UIView Inspector'ı kullanın.
// Koşullu kesme noktası ayarlama
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"
// Özellikte izleme noktası
(lldb) watchpoint set variable self->_loadingState
// Duraklatılmış bağlamda kod yürütme
(lldb) expr self.view.backgroundColor = UIColor.redColor
Her iki IDE de LLDB'nin üzerinde grafik denetleyiciler sağlar. Android Studio, Layout Inspector (View hiyerarşisi), Network Inspector (HTTP isteği izleme) ve Database Inspector (gerçek zamanlı SQLite) içerir. Xcode, Debug Memory Graph (bellek sızıntısı analizi) ve View Debugger (UIKit katmanlarının 3D görünümü) sağlar.
Android 11'den itibaren Wi-Fi üzerinden hata ayıklama USB bağlantısı olmadan çalışır: Android Studio'dan QR kodunu taramanız yeterlidir. iOS, Xcode 9+ 'dan itibaren Wi-Fi hata ayıklamayı destekler — cihaz bir kez USB üzerinden bağlanır, ardından hata ayıklama oturumları ağ üzerinden çalışabilir. Wi-Fi hata ayıklama, öngörülemeyen gecikme ve paket kaybı nedeniyle CI sunucuları için uygun değildir, bu nedenle otomatikleştirilmiş ardışık düzenler her zaman USB kullanır. Ancak yerel geliştirme için Wi-Fi hata ayıklama belirgin şekilde daha kullanışlıdır — geliştirici kabloya bağlı değildir ve odanın diğer ucundaki bir cihazda uygulamayı test edebilir.
Android Debug Bridge (ADB), komut satırından bir Android cihazıyla etkileşim kurmak için evrensel bir araçtır. ADB aracılığıyla bir uygulama yükleyebilir, hata ayıklamayı başlatabilir, dosyaları kopyalayabilir, shell komutları çalıştırabilir ve günlükleri görüntüleyebilirsiniz. Android Studio, tüm hata ayıklama işlemleri için ADB'yi dahili olarak kullanır.
Android Studio iki hata ayıklama modunu destekler: Run (normal başlatma) ve Debug (hata ayıklayıcı bağlı olarak başlatma). Debug modunda doğrudan düzenleyicide kesme noktaları ayarlayabilir, Debug Tool penceresinde değişkenleri inceleyebilir ve Evaluate Expression'da ifadeleri değerlendirebilirsiniz. Arka plan işlemlerinde (Service, BroadcastReceiver) hata ayıklamak için Attach Debugger to Android Process'i kullanın.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Buradaki kesme noktası yürütmeyi duraklatacak
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 komutları root ayrıcalıkları olmadan cihaz dosya sistemine erişim sağlar. databases dizininin içeriğini görüntüleyebilir, .db dosyasını bilgisayarınıza kopyalayabilir ve herhangi bir SQLite istemcisiyle açabilirsiniz. Android Studio Database Inspector bu süreci otomatikleştirir: gerçek zamanlı olarak canlı veritabanı verilerini görür ve doğrudan IDE'den SQL sorguları çalıştırabilirsiniz.
Xcode, LLDB tabanlı entegre bir hata ayıklama ortamı sağlar. Geliştirici, uygulamayı bir simülatör veya fiziksel cihazda çalıştırabilir, kesme noktaları ayarlayabilir ve yürütme iş parçacıklarını kontrol etmek için Debug Navigator'ı kullanabilir. Android'in aksine iOS, özel bir yapılandırma olmadan aynı cihazda aynı anda iki Debug derlemesi çalıştırmaya izin vermez.
Simülatör uygulamayı yerel bir macOS işlemi olarak çalıştırarak en hızlı hata ayıklama döngüsünü sağlar. Fiziksel bir cihazda hata ayıklama USB veya Wi-Fi (iOS 16'dan itibaren) üzerinden gerçekleşir ve LLDB cihazdaki debugserver ile iletişim kurar. Sınırlı USB 2.0 bant genişliği nedeniyle cihazdaki hata ayıklama performansı daha düşüktür, ancak yalnızca fiziksel bir cihaz gerçek senaryoları test etmeye olanak tanır: push bildirimleri, kamera, sensörler.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
let label = UILabel()
label.text = "Hata Ayıklama Modu"
label.textColor = .systemBlue
view.addSubview(label)
}
}
Xcode Organizer, Crash Logs aracılığıyla test uzmanlarının cihazlarından çökme günlükleri toplar. Symbolication (adresleri işlev adlarına dönüştürme) için her Debug derlemesiyle oluşturulan .dSYM dosyası gerekir. Release derlemesinde de dSYM oluşturulur, ancak App Store'dan gelen çökme günlükleri manuel olarak veya bitcode hizmeti aracılığıyla Organizer'a yüklenmelidir.
Sıkça Sorulan Sorular
Teknik olarak evet — Debug sertifikasıyla Ad Hoc dağıtımı yoluyla, ancak Apple ve Google bunu önermez. Debug derlemesi hata ayıklama sembolleri ve düşük performans içerir, bu da UX'i bozar ve uygulama boyutunu 2–3 kat artırır.
Nedeni derleyici optimizasyonunun devre dışı olmasıdır (-O0). Derleyici işlevleri satır içine almaz, ölü kodu kaldırmaz ve tüm ara değişkenleri tutar. Ek olarak Debug, Release'de bulunmayan iddia ve dizi sınır kontrollerini içerir.
Xcode'da Window → Devices and Simulators'ı seçin, cihazınız için “Connect via network”ü işaretleyin. Cihaz ve Mac aynı Wi-Fi ağında olmalıdır. USB üzerinden bir kez bağlandıktan sonra, sonraki başlatmalarda hata ayıklama Wi-Fi üzerinden çalışacaktır.
Attach to process, uygulamayı yeniden başlatmadan zaten çalışmakta olan bir sürece hata ayıklayıcıyı bağlamanıza olanak tanır. Bu, standart Debug Run'ın uygulanamadığı Service, BroadcastReceiver veya sistem olayıyla başlatılan süreçlerde hata ayıklamak için kullanışlıdır.
NSLog ve print varsayılan olarak yalnızca Debug yapılandırmasında günlük çıktısı verir. Release için OSLogType.default bayrağıyla os_log kullanın — mesajları Unified Logging System'e kaydeder ve Mac'te Console.app aracılığıyla erişilebilir.
Ö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