Uygulamanızda hata ayıklama

Android Studio, aşağıdakileri ve daha fazlasını yapmanıza olanak tanıyan bir hata ayıklayıcı sunar:

  • Uygulamanızda hata ayıklamak için bir cihaz seçin.
  • Java, Kotlin ve C/C++ kodunuzda kesme noktaları ayarlayın.
  • Çalışma zamanında değişkenleri inceleyin ve ifadeleri değerlendirin.

Bu sayfada, temel hata ayıklayıcı işlemleriyle ilgili talimatlar yer alır. Daha fazla belge için IntelliJ IDEA hata ayıklama belgelerine de bakabilirsiniz.

Hata ayıklamayı etkinleştirme

Hata ayıklamaya başlamadan önce aşağıdakileri yapın:

Cihazınızda hata ayıklamayı etkinleştirin.
Emülatör kullanıyorsanız hata ayıklama varsayılan olarak etkindir. Ancak bağlı bir cihaz için cihaz geliştirici seçeneklerinde hata ayıklamayı etkinleştirmeniz gerekir.
Hata ayıklanabilir bir derleme değişkeni çalıştırın.

Derleme yapılandırmasında debuggable true (Kotlin komut dosyalarında isDebuggable = true) içeren bir derleme değişkeni kullanın.

Genellikle, build.gradle dosyasında görünmese bile her Android Studio projesinde bulunan varsayılan "hata ayıklama" varyantını seçebilirsiniz. Ancak hata ayıklanabilir olması gereken yeni derleme türleri tanımlarsanız derleme türüne debuggable true eklemeniz gerekir:

Modern

android {
    buildTypes {
        customDebugType {
            debuggable true
            ...
        }
    }
}

Kotlin

android {
    buildTypes {
        create("customDebugType") {
            isDebuggable = true
            ...
        }
    }
}

Bu özellik, C/C++ kodu içeren modüller için de geçerlidir.

Not: jniDebuggable özelliği artık kullanılmıyor.

Uygulamanız, hata ayıklamak istediğiniz bir kitaplık modülüne bağlıysa bu kitaplığın da hata ayıklama sembollerini koruması için debuggable true ile paketlenmesi gerekir. Uygulama projenizin hata ayıklanabilir varyantlarının bir kitaplık modülünün hata ayıklanabilir varyantını aldığından emin olmak için kitaplığınızın varsayılan olmayan sürümlerini yayınlayın.

Hata ayıklamayı başlatma

Hata ayıklama oturumunu aşağıdaki şekilde başlatabilirsiniz:

  1. Uygulamanızın kodunda kesme noktaları ayarlayın.
  2. Araç çubuğundaki hedef cihaz menüsünden uygulamanızda hata ayıklamak istediğiniz cihazı seçin.
    Hedef cihaz menüsü.
    Şekil 1. Hedef cihaz menüsü.

    Yapılandırılmış cihazınız yoksa Android Emulator'ı kullanmak için USB üzerinden cihaz bağlamanız, kablosuz ağ üzerinden cihaz bağlamanız veya AVD oluşturmanız gerekir.

  3. Araç çubuğunda Hata ayıkla'yı tıklayın.

    Uygulamanız cihazda zaten çalışıyorsa Çalıştır'dan Hata Ayıkla'ya geçmek isteyip istemediğinizi soran bir iletişim kutusu gösterilir. Hata ayıklamaya başlamak için cihazın yeniden başlatılması gerekir. Uygulamanın aynı örneğinin çalışmaya devam etmesi için Hata Ayıklamayı İptal Et'i tıklayın ve bunun yerine hata ayıklayıcıyı çalışan bir uygulamaya ekleyin. Aksi takdirde Android Studio bir APK oluşturur, hata ayıklama anahtarıyla imzalar, seçtiğiniz cihaza yükler ve çalıştırır.

    Projenize C ve C++ kodu eklerseniz Android Studio, yerel kodunuzda hata ayıklamak için Hata Ayıklama penceresinde LLDB hata ayıklayıcıyı da çalıştırır.

  4. Hata ayıklama penceresi açık değilse View > Tool Windows > Debug'ı (Görünüm > Araç Pencereleri > Hata Ayıkla) seçin veya araç penceresi çubuğunda Debug'ı (Hata Ayıkla) tıklayın.

Hata ayıklayıcıyı çalışan bir uygulamaya ekleme

Uygulamanız cihazınızda zaten çalışıyorsa uygulamanızı yeniden başlatmadan hata ayıklamaya aşağıdaki şekilde başlayabilirsiniz:

  1. Attach debugger to Android process'i (Hata ayıklayıcıyı Android işlemine ekle) tıklayın.
  2. Choose Process (İşlem Seç) iletişim kutusunda, hata ayıklayıcıyı eklemek istediğiniz işlemi seçin.
    1. Emülatör veya root erişimli cihaz kullanıyorsanız tüm işlemleri görmek için Tüm işlemleri göster'i işaretleyebilirsiniz. Root erişimli cihazlarda, cihazda çalışan tüm işlemler gösterilir. Ancak root erişimli olmayan bir cihazda bu komut yalnızca hata ayıklanabilir işlemleri gösterir.
    2. Use Android Debugger Settings from (Android Hata Ayıklayıcı Ayarlarını Şuradan Kullan) menüsünden mevcut bir çalıştırma/hata ayıklama yapılandırmasını seçebilirsiniz. C ve C++ kodu için bu, mevcut bir yapılandırmadaki LLDB başlangıç komutlarını, LLDB ekleme sonrası komutlarını ve sembol dizinlerini yeniden kullanmanıza olanak tanır.
    3. Mevcut bir çalıştırma/hata ayıklama yapılandırmanız yoksa Yeni Oluştur'u seçin. Bu seçim, farklı bir hata ayıklama türü seçebileceğiniz Hata Ayıklama Türü menüsünü etkinleştirir. Android Studio, varsayılan olarak Otomatik Algıla hata ayıklama türünü kullanarak projenizin Java veya C/C++ kodu içerip içermediğine göre sizin için en iyi hata ayıklayıcı seçeneğini belirler.
  3. Tamam'ı tıklayın.

    Hata ayıklama penceresi açılır.

Cihaz Gezgini'ndeki (Görünüm > Araç Pencereleri > Cihaz Gezgini) İşlemler sekmesinde de hata ayıklanabilir işlemlerin listesi bulunur. Buradan bir işlem seçip sonlandırabilir , zorla durdurabilir veya hata ayıklayıcıyı belirli bir işleme ekleyebilirsiniz .

Hata ayıklama penceresi

Şekil 2.Hata ayıklama penceresi.

Hata ayıklama penceresi iki bölüme ayrılmıştır:

  1. Yürütme ve gezinme araç çubuğu Kesme noktalarıyla çalışma bölümüne bakın.
  2. İleti dizisi seçici
  3. Değerlendirme ve izleme ifadesi girişi. Değişkenleri inceleme bölümüne bakın.
  4. Yığın ekranı
  5. Değişkenler bölmesi. Değişkenleri inceleme bölümüne bakın.

Not: Android Studio hata ayıklayıcısı ve çöp toplayıcı, gevşek bir şekilde entegre edilmiştir. Android sanal makinesi, hata ayıklayıcının bildiği hiçbir nesnenin, hata ayıklayıcının bağlantısı kesilene kadar çöp olarak toplanmamasını garanti eder. Bu durum, hata ayıklayıcı bağlıyken nesnelerin birikmesine neden olabilir. Örneğin, hata ayıklayıcı çalışan bir iş parçacığı görürse ilişkili Thread nesnesi, iş parçacığı sonlandırılmış olsa bile hata ayıklayıcının bağlantısı kesilene kadar çöp olarak toplanmaz.

Hata ayıklayıcı türünü değiştirme

Java/Kotlin kodunda ve C/C++ kodunda hata ayıklamak için farklı hata ayıklama araçları gerektiğinden Android Studio hata ayıklayıcısı, hangi hata ayıklayıcı türünü kullanacağınızı seçmenize olanak tanır. Android Studio, varsayılan olarak Otomatik Olarak Algıla hata ayıklayıcı türünü kullanarak projenizde algıladığı dillere göre hangi hata ayıklayıcının kullanılacağına karar verir.

Hata ayıklama yapılandırmasında hata ayıklayıcıyı manuel olarak seçmek için Çalıştır > Yapılandırmaları Düzenle'yi tıklayın. Hata ayıklayıcıyı, Run > Attach debugger to Android process'i (Çalıştır > Hata ayıklayıcıyı Android işlemine ekle) tıkladığınızda görünen iletişim kutusundan da seçebilirsiniz.

Kullanılabilir hata ayıklama türleri şunlardır:

Otomatik olarak algıla
Android Studio'nun, hata ayıklama yaptığınız kod için en iyi seçeneği otomatik olarak belirlemesini istiyorsanız bu hata ayıklama türünü seçin. Örneğin, projenizde C veya C++ kodu varsa Android Studio otomatik olarak Dual hata ayıklama türünü kullanır. Aksi takdirde Android Studio, yalnızca Java hata ayıklama türünü kullanır.
Yalnızca Java
Yalnızca Java veya Kotlin ile yazılmış kodda hata ayıklamak istiyorsanız bu hata ayıklama türünü seçin. Yalnızca Java hata ayıklayıcısı, yerel kodunuzda ayarladığınız kesme noktalarını veya izlemeleri yoksayar.
Yalnızca Yerel (yalnızca C/C++ koduyla kullanılabilir)
Kodunuzda hata ayıklamak için yalnızca LLDB'yi kullanmak istiyorsanız bu hata ayıklama türünü seçin. Bu hata ayıklama türü kullanıldığında Java hata ayıklayıcı oturum görünümü kullanılamaz. Varsayılan olarak LLDB yalnızca yerel kodunuzu inceler ve Java kodunuzdaki kesme noktalarını yoksayar. Java kodunuzda da hata ayıklamak istiyorsanız Otomatik Olarak Algıla veya İkili hata ayıklama türüne geçin.

Yerel hata ayıklama yalnızca aşağıdaki koşulları karşılayan cihazlarda çalışır:

  • Cihaz run-as özelliğini destekliyor.

    Cihazın run-as özelliğini destekleyip desteklemediğini kontrol etmek için cihazınıza bağlı ADB kabuğunda aşağıdaki komutu çalıştırın:

    run-as your-package-name pwd
    

    your-package-name ifadesini uygulamanızın paket adıyla değiştirin. Cihaz run-as özelliğini destekliyorsa komut herhangi bir hata olmadan döndürülmelidir.

  • Cihazda ptrace etkinleştirilmiş.

    ptrace özelliğinin etkin olup olmadığını kontrol etmek için cihazınıza bağlı ADB kabuğunda aşağıdaki komutu çalıştırın:

    sysctl kernel.yama.ptrace_scope
    

    ptrace etkinleştirilirse komut, 0 değerini veya bir unknown key hatasını yazdırır. ptrace etkinleştirilmezse 0 dışında bir değer yazdırılır.

İkili (Java + Yerel): Yalnızca C/C++ koduyla kullanılabilir
Hem Java hem de yerel kodda hata ayıklama arasında geçiş yapmak istiyorsanız bu hata ayıklama türünü seçin. Android Studio, hem Java hata ayıklayıcısını hem de LLDB'yi uygulama işleminize ekler. Böylece, uygulamanızı yeniden başlatmadan veya hata ayıklama yapılandırmanızı değiştirmeden hem Java hem de yerel kodunuzdaki kesme noktalarını inceleyebilirsiniz.

Şekil 2'de, Hata ayıklama penceresi başlığının sağındaki iki sekmeye dikkat edin. Uygulamada hem Java hem de C++ kodu olduğundan, sekmelerden biri yerel kodda hata ayıklamak, diğeri ise -java ile belirtildiği gibi Java kodunda hata ayıklamak içindir.

Şekil 3. Yerel kodda hata ayıklama sekmesi ve Java kodunda hata ayıklama sekmesi.

Not: Derleyici tarafından optimize edilen yerel kodda hata ayıklarken şu uyarı mesajını alabilirsiniz:
This function was compiled with optimizations enabled. Some debugger features may not be available. Optimizasyon işaretleri kullanıldığında derleyici, derlenen kodunuzda değişiklikler yaparak kodun daha verimli çalışmasını sağlar. Bu durum, hata ayıklayıcının beklenmedik veya yanlış bilgiler bildirmesine neden olabilir. Çünkü hata ayıklayıcının, optimize edilmiş derlenmiş kodu orijinal kaynak koduna geri eşlemesi zordur. Bu nedenle, yerel kodunuzda hata ayıklarken derleyici optimizasyonlarını devre dışı bırakmanız gerekir.

Sistem günlüğünü kullanma

Sistem günlüğü, uygulamanızda hata ayıklarken sistem mesajlarını gösterir. Bu mesajlar, cihazda çalışan uygulamalardan gelen bilgileri içerir. Uygulamanızda hata ayıklamak için sistem günlüğünü kullanmak istiyorsanız uygulamanız geliştirme aşamasındayken kodunuzun günlük mesajları yazdığından ve istisnalar için yığın izlemeyi (stack trace) yazdırdığından emin olun.

Kodunuzda günlük mesajları yazma

Kodunuzda günlük mesajları yazmak için Log sınıfını kullanın. Günlük mesajları, uygulamanızla etkileşim kurarken sistem hata ayıklama çıkışını toplayarak yürütme akışını anlamanıza yardımcı olur. Günlük mesajları, uygulamanızın hangi bölümünün başarısız olduğunu da gösterebilir. Günlük kaydı hakkında daha fazla bilgi için Logcat ile günlük yazma ve görüntüleme başlıklı makaleyi inceleyin.

Aşağıdaki örnekte, etkinliğiniz başladığında önceki durum bilgilerinin mevcut olup olmadığını belirlemek için günlük mesajlarını nasıl ekleyebileceğiniz gösterilmektedir:

Kotlin

import android.util.Log
...
class MyActivity : Activity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state")
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available")
            /* initialize app */
        }
        ...
    }
  ...
  companion object {
    private val TAG: String = MyActivity::class.java.simpleName
    ...
  }
}

Java

import android.util.Log;
...
public class MyActivity extends Activity {
    private static final String TAG = MyActivity.class.getSimpleName();
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
       ...
       if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state");
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available");
            /* initialize app */
        }
        ...
    }
}

Geliştirme sırasında kodunuz istisnaları da yakalayabilir ve yığın izlemeyi sistem günlüğüne yazabilir:

Kotlin

fun someOtherMethod() {
    try {
        ...
    } catch (e : SomeException) {
        Log.d(TAG, "someOtherMethod()", e)
    }
}

Java

void someOtherMethod() {
    try {
        ...
    } catch (SomeException e) {
        Log.d(TAG, "someOtherMethod()", e);
    }
}

Not: Uygulamanızı yayınlamaya hazır olduğunuzda hata ayıklama günlüğü mesajlarını ve yığın izleme yazdırma çağrılarını kodunuzdan kaldırın. Bunun için bir DEBUG işareti ayarlayın ve hata ayıklama günlüğü mesajlarını koşullu ifadelerin içine yerleştirin.

Sistem günlüğünü görüntüleme

Şekil 4'te gösterildiği gibi, Logcat penceresinde hata ayıklama ve diğer sistem mesajlarını görüntüleyip filtreleyebilirsiniz. Örneğin, çöp toplama işlemi gerçekleştiğinde mesajları veya Log sınıfıyla uygulamanıza eklediğiniz mesajları görebilirsiniz.

Logcat'i kullanmak için hata ayıklamayı başlatın ve Logcat sekmesini seçin.

Şekil 4. Filtre ayarlarının bulunduğu Logcat penceresi.

Logcat ve filtreleme seçeneklerinin açıklaması için Logcat ile günlük yazma ve görüntüleme başlıklı makaleyi inceleyin.

Kesme noktalarıyla çalışma

Android Studio, farklı hata ayıklama işlemlerini tetikleyen kesme noktalarını destekler. Birkaç kesme noktası türü vardır:

Satır kesme noktası
En yaygın tür, uygulamanızın yürütülmesini belirli bir kod satırında duraklatan satır kesme noktasıdır. Duraklatma sırasında değişkenleri inceleyebilir, ifadeleri değerlendirebilir ve ardından çalışma zamanı hatalarının nedenlerini belirlemek için satır satır yürütmeye devam edebilirsiniz.
Yöntem kesme noktası
Yöntem kesme noktası, uygulamanız belirli bir yönteme girdiğinde veya yöntemden çıktığında uygulamanızın yürütülmesini duraklatır. Duraklatma sırasında değişkenleri inceleyebilir, ifadeleri değerlendirebilir ve ardından çalışma zamanı hatalarının nedenlerini belirlemek için satır satır yürütmeye devam edebilirsiniz. Bir composable işlevde kesme noktası ayarladığınızda hata ayıklayıcı, yeniden oluşturmaya neden olabilecek değişiklikleri belirlemenize yardımcı olmak için composable'ın parametrelerini ve durumlarını listeler.
Alan kesme noktası
Alan kesme noktası, uygulamanız belirli bir alandan okuma veya alana yazma işlemi yaparken uygulamanızın yürütülmesini duraklatır.
İstisna kesme noktası
İstisna kesme noktası, bir istisna oluşturulduğunda uygulamanızın yürütülmesini duraklatır.

Yalnızca belirli koşullar karşılandığında yürütmeyi askıya alacak koşullu kesme noktaları ayarlayabilirsiniz. Yürütmeyi askıya almadan Logcat'e yazan günlük kaydı kesme noktaları da ayarlayabilirsiniz. Bu sayede kodunuzu günlük ifadeleriyle doldurmaktan kaçınabilirsiniz.

Satır kesme noktası eklemek için aşağıdaki adımları uygulayın:

  1. Yürütmeyi duraklatmak istediğiniz kod satırını bulun.
  2. İlgili kod satırının solundaki boşluğu tıklayın veya imleci satıra getirip Ctrl+F8 (macOS'te Command+F8) tuşlarına basın.
  3. Uygulamanız zaten çalışıyorsa Attach debugger to Android process'i (Hata ayıklayıcıyı Android işlemine ekle) tıklayın. Aksi takdirde, hata ayıklamaya başlamak için Hata ayıkla'yı tıklayın .

Şekil 5'te gösterildiği gibi, bir kesme noktası ayarladığınızda satırın yanında kırmızı bir nokta görünür.

Şekil 5. Bir kesme noktası ayarladığınızda satırın yanında kırmızı bir nokta görünür.

Kod yürütme işleminiz kesme noktasına ulaştığında Android Studio, uygulamanızın yürütme işlemini duraklatır.

Uygulamanın durumunu belirlemek için Hata Ayıklayıcı sekmesindeki araçları kullanın:

  • Bir değişkenin nesne ağacını incelemek için Değişkenler görünümünde değişkeni genişletin. Değişkenler görünümü görünmüyorsa Düzen Ayarları'nı tıklayın ve değişkenler'in işaretli olduğundan emin olun.

  • Bir yöntem girmeden koddaki bir sonraki satıra geçmek için Step Over'ı (Atla) tıklayın.

  • Bir yöntem çağrısındaki ilk satıra ilerlemek için İçine Adımla'yı tıklayın.

  • Mevcut yöntemin dışındaki bir sonraki satıra geçmek için Step Out'u (Dışarı Adım At) tıklayın.

  • Uygulamayı normal şekilde çalıştırmaya devam etmek için Programı Devam Ettir'i tıklayın.

Projeniz yerel kod kullanıyorsa Otomatik Olarak Algıla hata ayıklama türü, varsayılan olarak hem Java hata ayıklayıcıyı hem de LLDB'yi uygulamanıza iki ayrı işlem olarak ekler. Uygulamanızı yeniden başlatmadan veya ayarları değiştirmeden Java ve C/C++ kesme noktalarını inceleme arasında geçiş yapabilirsiniz.

Not: Android Studio'nun C veya C++ kodunuzdaki kesme noktalarını algılaması için LLDB'yi destekleyen bir hata ayıklama türü (ör. Otomatik Olarak Algıla, Yerel veya Çift) kullanmanız gerekir. Hata ayıklama yapılandırmanızı düzenleyerek Android Studio'nun kullandığı hata ayıklama türünü değiştirebilirsiniz. Farklı hata ayıklama türleri hakkında daha fazla bilgi edinmek için diğer hata ayıklama türlerini kullanma bölümünü okuyun.

Android Studio, uygulamanızı hedef cihazınıza dağıttığında, Şekil 6'da gösterildiği gibi her hata ayıklayıcı işlemi için bir sekme veya hata ayıklama oturumu görünümü içeren Hata Ayıklama penceresi açılır.

Şekil 6. LLDB kullanarak yerel kodda hata ayıklama
  1. LLDB hata ayıklayıcı, C/C++ kodunuzda bir kesme noktasıyla karşılaştığında Android Studio, <your-module> sekmesine geçer. Frames, Variables ve Watches bölmeleri de kullanılabilir ve Java kodunda hata ayıklama yaparken olduğu gibi çalışır.

    LLDB oturum görünümünde Threads (İş Parçacıkları) bölmesi kullanılamasa da Frames (Çerçeveler) bölmesindeki listeyi kullanarak uygulama işlemlerinize erişebilirsiniz. Pencere çerçevelerinde hata ayıklama ve değişkenleri inceleme ile ilgili bölümlerde bu paneller hakkında daha fazla bilgi edinebilirsiniz.

    Not: Android sistemi, yerel kodunuzdaki bir kesme noktasını incelerken uygulamanızın Java bayt kodunu çalıştıran sanal makineyi askıya alır. Bu, yerel kodunuzdaki bir kesme noktasını incelerken Java hata ayıklayıcısıyla etkileşim kuramayacağınız veya Java hata ayıklayıcı oturumunuzdan herhangi bir durum bilgisi alamayacağınız anlamına gelir.

  2. Java hata ayıklayıcı, Java veya Kotlin kodunuzda bir kesme noktasıyla karşılaştığında Android Studio, <your-module>-java sekmesine geçer.
  3. LLDB ile hata ayıklama yaparken LLDB oturum görünümündeki LLDB terminalini kullanarak komut satırı seçeneklerini LLDB'ye iletebilirsiniz. Uygulamanızda hata ayıklamaya her başladığınızda, hata ayıklayıcı uygulama işleminize eklenmeden hemen önce veya hemen sonra LLDB'nin yürütmesini istediğiniz belirli komutlar varsa bu komutları hata ayıklama yapılandırmanıza ekleyebilirsiniz.

C/C++ kodunda hata ayıklarken izleme noktaları adı verilen özel kesme noktası türleri de ayarlayabilirsiniz. Bunlar, uygulamanız belirli bir bellek bloğuyla etkileşimde bulunduğunda uygulama işleminizi askıya alabilir. Daha fazla bilgi edinmek için izleme noktası ekleme ile ilgili bölümü okuyun.

Kesme noktalarını görüntüleme ve yapılandırma

Tüm kesme noktalarını görüntülemek ve kesme noktası ayarlarını yapılandırmak için Hata ayıklama penceresinde Kesme Noktalarını Görüntüle'yi tıklayın. Şekil 7'de gösterildiği gibi Breakpoints (Kesme Noktaları) penceresi açılır.

7.şekil Kesme noktaları penceresinde, mevcut tüm kesme noktaları listelenir ve her biri için davranış ayarları yer alır.

Kesme Noktaları penceresi, bölmedeki listeden her bir kesme noktasını etkinleştirmenize veya devre dışı bırakmanıza olanak tanır. Bir kesme noktası devre dışı bırakılırsa Android Studio, bu kesme noktasına ulaştığında uygulamanızı duraklatmaz.

Ayarlarını yapılandırmak için listeden bir kesme noktası seçin. Bir kesme noktasını başlangıçta devre dışı bırakılacak şekilde yapılandırabilir ve sistemin farklı bir kesme noktasına ulaşıldıktan sonra bu kesme noktasını etkinleştirmesini sağlayabilirsiniz. Bir kesme noktasının, isabet ettikten sonra devre dışı bırakılıp bırakılmayacağını da yapılandırabilirsiniz. Herhangi bir istisna için kesme noktası ayarlamak istiyorsanız kesme noktaları listesinde İstisna Kesme Noktaları'nı seçin.

Tüm kesme noktalarını geçici olarak devre dışı bırakmak için Hata Ayıklama penceresinde Kesme Noktalarının Sesini Kapat'ı tıklayın. Yeniden etkinleştirmek için tekrar tıklayın.

Hata ayıklama penceresi çerçeveleri

Hata ayıklayıcı penceresindeki Kareler bölmesi, geçerli kesme noktasının tetiklenmesine neden olan yığın çerçevesini incelemenize olanak tanır. Bu sayede yığın çerçevesinde gezinip inceleyebilir ve Android uygulamanızdaki iş parçacıklarının listesini kontrol edebilirsiniz.

Bir ileti dizisi seçmek için ileti dizisi seçici menüsünü kullanın ve yığın çerçevesini görüntüleyin. Kaynağı düzenleyicide açmak için çerçevedeki öğeleri tıklayın. Ayrıca, Kareleri İnceleme kılavuzunda açıklandığı gibi ileti dizisi sunumunu özelleştirebilir ve yığın çerçevesini dışa aktarabilirsiniz.

Değişkenleri inceleme

Sistem, uygulamanızı bir kesme noktasında durdurduğunda ve siz Kareler bölmesinden bir kare seçtiğinizde, Hata Ayıklayıcı penceresindeki Değişkenler bölmesi değişkenleri incelemenize olanak tanır. Değişkenler bölmesi, seçilen çerçevedeki statik yöntemleri ve/veya değişkenleri kullanarak geçici ifadeleri değerlendirmenize de olanak tanır.

Nesne ağacına ifade eklemek için (uygulamada hata ayıklama yapılırken):

Şekil 8. Hata ayıklama penceresindeki nesne ağacı ve ifade giriş kutusu.
  1. İzlenecek veya görüntülenecek ifadeyi girin
  2. İfadeyi bir kez değerlendirmek için İzlenenlere ekle'yi tıklayın veya Enter tuşuna basın.

Alternatif olarak, nesne ağacı izlemek istediğiniz ifadeyi içeriyorsa izlenen ifade olarak eklemek için ağacın en üstüne sürükleyebilirsiniz.

İzlenen ifadeler, kesme noktalarına ulaşıldığında veya kodunuzda adım adım ilerlediğinizde güncellenir.

Değerlendirilen ifadeler, siz başka bir ifadeyi manuel olarak değerlendirene veya kodunuzda adım adım ilerleyene kadar nesne ağacının üst kısmında gösterilmeye devam eder.

İzlenen bir ifadeyi nesne ağacından kaldırmak için ifadeyi sağ tıklayın ve ardından İzlemeyi Kaldır'ı tıklayın.

İzleme noktası ekleme

C/C++ kodunda hata ayıklarken, uygulamanız belirli bir bellek bloğuyla etkileşime girdiğinde uygulama işleminizi askıya alabilen izleme noktaları adlı özel kesme noktası türleri ayarlayabilirsiniz. Örneğin, bir bellek bloğuna iki işaretçi ayarlayıp buna bir izleme noktası atarsanız bellek bloğuna erişmek için işaretçilerden birini kullandığınızda izleme noktası tetiklenir.

Android Studio'da, çalışma zamanında belirli bir değişkeni seçerek izleme noktası oluşturabilirsiniz ancak LLDB, izleme noktasını değişkenin kendisine değil, yalnızca sistemin bu değişkene ayırdığı bellek bloğuna atar. Bu, İzlemeler bölmesine değişken eklemekten farklıdır. İzlemeler bölmesine değişken eklediğinizde değişkenin değerini gözlemleyebilirsiniz ancak sistem, değişkenin değerini bellekte okuduğunda veya değiştirdiğinde uygulama işleminizi askıya alamazsınız.

Not: Uygulama işleminiz bir işlevden çıktığında ve sistem, yerel değişkenlerini bellekten kaldırdığında bu değişkenler için oluşturduğunuz izleme noktalarını yeniden atamanız gerekir.

İzleme noktası ayarlamak için aşağıdaki şartları karşılamanız gerekir:

  • Hedef fiziksel cihazınız veya emülatörünüz x86 ya da x86_64 CPU kullanıyor. Cihazınızda ARM CPU kullanılıyorsa bellekteki değişken adresinizin sınırını 32 bit işlemciler için 4 bayt, 64 bit işlemciler için 8 bayt olarak hizalamanız gerekir. Yerel kodunuzdaki bir değişkeni hizalamak için değişken bildiriminde __attribute__((aligned(num_bytes))) değerini belirtin (aşağıda gösterildiği gibi):
    // For a 64-bit ARM processor
    int my_counter __attribute__((aligned(8)));
  • Zaten üç veya daha az izleme noktası atadınız. Android Studio, x86 veya x86_64 hedef cihazlarda yalnızca dört izleme noktası destekler. Diğer cihazlar daha az izleme noktasını destekleyebilir.

Not: Uygulamanızda 32 bit ARM ABI'lerle hata ayıklama yaparken izleme noktası eklemek veya kodun içindeki değişkenlerin değerlerini incelemek için fareyle üzerlerine gelmek kilitlenmeye neden olabilir. Bu sorunu geçici olarak çözmek için 64 bit ARM, x86 veya x86_64 ikili programlarını kullanarak hata ayıklayın. Bu sorun, Android Studio'nun gelecek bir sürümünde düzeltilecektir.

Şartları karşılıyorsanız aşağıdaki adımları uygulayarak izleme noktası ekleyebilirsiniz:

  1. Uygulamanız bir kesme noktasında askıya alınmışken LLDB oturum görünümünüzdeki Variables (Değişkenler) bölmesine gidin.
  2. İzlemek istediğiniz bellek bloğunu kaplayan bir değişkeni sağ tıklayın ve İzleme Noktası Ekle'yi seçin.

    9.şekil Bellekteki bir değişkene izleme noktası ekleyin.
  3. Şekil 9'da gösterildiği gibi, izleme noktanızı yapılandırmak için bir iletişim kutusu açılır.

    İzleme noktanızı aşağıdaki seçeneklerle yapılandırın:

    • Etkin: Android Studio'ya, siz ayarı değiştirene kadar izleme noktasını yoksaymasını söylemek istiyorsanız bu seçeneğin işaretini kaldırın. Android Studio, izleme noktanızı daha sonra erişebilmeniz için kaydeder.
    • Askıya alma: Android sistemi, izleme noktasına atadığınız bir bellek bloğuna eriştiğinde varsayılan olarak uygulama işleminizi askıya alır. Bu davranışı istemiyorsanız bu seçeneğin işaretini kaldırın. Bu işlem, sistem izleme noktanızla etkileşime girdiğinde davranışı özelleştirmek için kullanabileceğiniz ek seçenekleri gösterir: Günlük mesajını konsola kaydet ve İsabet edildiğinde kaldır.
    • Erişim Türü: Uygulamanızın, sistemin değişkene ayırdığı bellek bloğunu okumaya veya yazmaya çalıştığında izleme noktanızı tetikleyip tetiklemeyeceğini seçin. İzleme noktanızı okuma veya yazma işleminde tetiklemek için Herhangi biri'ni seçin.
  4. Bitti'yi tıklayın.

Tüm izleme noktalarınızı görüntülemek ve izleme noktası ayarlarını yapılandırmak için Hata Ayıklama penceresinde Kesme Noktalarını Görüntüle'yi tıklayın. Şekil 10'da gösterildiği gibi Breakpoints (Kesme Noktaları) iletişim kutusu görünür.

10. şekil. Kesme Noktaları iletişim kutusunda mevcut izleme noktalarınız listelenir ve her biri için davranış ayarları bulunur.

İzleme noktanızı ekledikten sonra, uygulama işleminizi devam ettirmek için Hata Ayıklama penceresinde Programı Devam Ettir'i tıklayın. Varsayılan olarak, uygulamanız izleme noktası ayarladığınız bir bellek bloğuna erişmeye çalışırsa Android sistemi, uygulama işleminizi askıya alır ve Şekil 11'de gösterildiği gibi, uygulamanızın en son yürüttüğü kod satırının yanında bir izleme noktası simgesi görünür.

11. şekil. Android Studio, uygulamanızın izleme noktasını tetiklemeden hemen önce yürüttüğü kod satırını gösterir.

Kaynak değeri görüntüleme biçimini görüntüleme ve değiştirme

Hata ayıklama modunda, kaynak değerlerini görüntüleyebilir ve Java veya Kotlin kodunuzdaki değişkenler için farklı bir görüntüleme biçimi seçebilirsiniz. Değişkenler sekmesi görüntülenirken ve bir kare seçiliyken aşağıdakileri yapın:

  1. Değişkenler listesinde, listeyi görüntülemek için bir kaynak satırında herhangi bir yeri sağ tıklayın.
  2. Listede Farklı görüntüle'yi ve kullanmak istediğiniz biçimi seçin.

    Kullanılabilir biçimler, seçtiğiniz kaynağın veri türüne bağlıdır. Aşağıdaki seçeneklerden birini veya daha fazlasını görebilirsiniz:

    • Sınıf: Sınıf tanımını gösterir.
    • toString: Görüntüleme dizesi biçimi.
    • Nesne: Nesne (bir sınıfın örneği) tanımını gösterir.
    • Dizi: Dizi biçiminde gösterilir.
    • Zaman damgası: Tarih ve saati şu şekilde gösterin: yyyy-aa-gg ss:dd:ss.
    • Otomatik: Android Studio, veri türüne göre en iyi biçimi seçer.
    • İkili: Sıfır ve birleri kullanarak ikili değer gösterir.
    • MeasureSpec: Üst öğeden seçilen alt öğeye aktarılan değer. MeasureSpec sayfasına bakın.
    • Onaltılık: Onaltılık değer olarak gösterilir.
    • İlkel: İlkel veri türü kullanılarak sayısal değer olarak gösterilir.
    • Tam sayı: Integer türünde sayısal değer olarak gösterilir.

Özel biçim oluşturmak için aşağıdakileri yapın:

  1. Kaynak değerini sağ tıklayın.
  2. Farklı görüntüle'yi seçin.
  3. Üret'i seçin.
  4. Java Veri Türü Oluşturucular iletişim kutusu gösterilir. Java veri türü oluşturucular sayfasındaki talimatları uygulayın.