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ıklama işlemi yapmak için bir cihaz seçin.
  • Java, Kotlin ve C/C++ kodunuzda kesme noktaları ayarlayın.
  • Değişkenleri inceleyin ve ifadeleri çalışma zamanında değerlendirin.

Bu sayfada, temel hata ayıklayıcı işlemleriyle ilgili talimatlar yer almaktadır. Daha fazla doküman için IntelliJ IDEA hata ayıklama dokümanlarına da bakın.

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ın geliştirici seçeneklerinde hata ayıklamayı etkinleştirmeniz gerekir.
Hata ayıklanabilir bir derleme çeşidi çalıştırın.

Derleme yapılandırmasına debuggable true (Kotlin komut dosyalarında isDebuggable = true) içeren bir derleme varyantı kullanın.

Genellikle, build.gradle dosyasında görünmese de her Android Studio projesinde bulunan varsayılan "debug" 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:

Groovy

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ılmamaktadır.

Uygulamanız, hata ayıklamak istediğiniz bir kitaplık modülüne bağlıysa bu kitaplık da hata ayıklama sembollerini korumak için debuggable true ile paketlenmelidir. Uygulama projenizin hata ayıklanabilir varyantlarının, 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 gibi başlatabilirsiniz:

  1. Uygulamanızın kodunda kesme noktaları ayarlayın.
  2. Araç çubuğunda, hedef cihaz menüsünden uygulamanızda hata ayıklama yapacağınız cihazı seçin.
    Hedef cihaz menüsü.
    1. şekil. Hedef cihaz menüsü.

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

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

    Uygulamanız cihazda zaten çalışıyorsa Run'dan Debug'a 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 etmesini sağlamak 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, bunu bir 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ısını da çalıştırır.

  4. Hata ayıklama penceresi açık değilse Görünüm > Araç Pencereleri > Hata Ayıklama'yı seçin veya araç penceresi çubuğunda Hata Ayıklama'yı 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 başlamak için aşağıdaki adımları uygulayabilirsiniz:

  1. Attach debugger to Android process'i (Hata ayıklayıcıyı Android işlemine ekle) tıklayın.
  2. İşlem Seçin iletişim kutusunda, hata ayıklayıcıyı eklemek istediğiniz işlemi seçin.
    1. Emülatör veya root edilmiş bir cihaz kullanıyorsanız tüm işlemleri görmek için Tüm işlemleri göster'i işaretleyebilirsiniz. Root edilmiş bir cihazda bu işlem, cihazda çalışan tüm işlemleri gösterir. Ancak root erişimi olmayan bir cihazda bu yalnızca hata ayıklanabilir işlemleri gösterir.
    2. Use Android Debugger Settings from (Android hata ayıklayıcı ayarlarını kullan) menüsünden mevcut bir çalıştırma/hata ayıklama yapılandırması seçebilirsiniz. C ve C++ kodu için: Bu, mevcut bir yapılandırmada 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 projenizde Java veya C/C++ kodu olup olmadığına göre sizin için en iyi hata ayıklayıcı seçeneğini belirlemek üzere Otomatik Olarak Algıla hata ayıklama türünü kullanır.
  3. Tamam'ı tıklayın.

    Hata ayıklama penceresi görünü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 , durdurmaya zorlayabilir 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 şu bölümlere ayrılmıştır:

  1. Yürütme ve gezinme araç çubuğu Kesme noktalarıyla çalışma başlıklı makaleyi inceleyin.
  2. İplik seçici
  3. Değerlendirme ve izleme ifadesi girişi. Değişkenleri inceleme başlıklı makaleyi inceleyin.
  4. Grubu göster
  5. Değişkenler bölmesi. Değişkenleri inceleme başlıklı makaleyi inceleyin.

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 farkında olduğu hiçbir nesnenin hata ayıklayıcının bağlantısı kesilene kadar çöp toplama işlemine tabi tutulmayacağı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 iş parçacığı sonlandırılmış olsa bile hata ayıklayıcının bağlantısı kesilene kadar ilişkili Thread nesnesinde çöp toplama işlemi yapılmaz.

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

Java/Kotlin kodu ve C/C++ kodunda hata ayıklamak için farklı hata ayıklayıcı araçları gerektiğinden Android Studio hata ayıklayıcısı, hangi hata ayıklayıcı türünün kullanılacağını 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. Ayrıca, Run > Attach debugger to Android process (Çalıştır > Hata ayıklayıcıyı Android işlemine ekle) seçeneğini tıkladığınızda açılan iletişim kutusunda hata ayıklayıcıyı seçebilirsiniz.

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

Otomatik olarak algıla
Android Studio'nun hata ayıklamasını 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 Çift 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 tüm 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ılırken Java hata ayıklama oturumu 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 Çift 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 yerine uygulamanızın paket adını yazın. Cihaz run-as'ı destekliyorsa komut hatasız olarak döndürülmelidir.

  • Cihazda ptrace etkinleştirilmiş olmalıdır.

    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 etkinse komut, 0 değerini veya unknown key hatasını yazdırır. ptrace etkinleştirilmemişse 0 dışında bir değer yazdırılır.

Çift (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 sürecinize 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 bulunduğundan, -java ile belirtildiği gibi bir sekme yerel kodda hata ayıklama, diğeri ise Java kodunda hata ayıklama içindir.

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

Not: Derleyici tarafından optimize edilen yerel kodda hata ayıklarken aşağıdaki uyarı mesajını alabilirsiniz:
This function was compiled with optimizations enabled. Some debugger features may not be available. Derleyici, optimizasyon işaretlerini kullanırken derlenmiş kodunuzda daha verimli çalışmasını sağlamak için değişiklikler yapar. Bu durum, hata ayıklayıcının optimize edilmiş derlenmiş kodu orijinal kaynak koduyla eşlemesi zor olduğundan hata ayıklayıcının beklenmedik veya yanlış bilgiler bildirmesine neden olabilir. Bu nedenle, yerel kodunuzda hata ayıklama yaparken 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 alınan bilgileri içerir. Uygulamanızda hata ayıklamak için sistem günlüğünü kullanmak istiyorsanız kodunuzun günlük mesajları yazdığından ve uygulamanız geliştirme aşamasındayken istisnalar için yığın izlemeyi yazdırdığından emin olun.

Kodunuza günlük mesajları yazma

Kodunuza 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 söyleyebilir. Günlüğe kaydetme hakkında daha fazla bilgi için Logcat ile günlükleri yazma ve görüntüleme başlıklı makaleyi inceleyin.

Aşağıdaki örnekte, etkinliğiniz başladığında önceki durum bilgilerinin kullanılabilir olup olmadığını belirlemek için nasıl günlük mesajları 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ı 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 izi yazdırma çağrılarını kodunuzdan kaldırın. Bunu yapmak için bir DEBUGişaret 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 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.

4.şekil 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ç tür kesme noktası 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. Yürütme duraklatıldığında değişkenleri inceleyebilir, ifadeleri değerlendirebilir ve ardından çalışma zamanı hatalarının nedenlerini belirlemek için yürütmeye satır satır devam edebilirsiniz.
Yöntem kesme noktası
Yöntem kesme noktası, uygulamanız belirli bir yönteme girdiğinde veya bu yöntemden çıktığında uygulamanızın yürütülmesini duraklatır. Yürütme duraklatıldığında değişkenleri inceleyebilir, ifadeleri değerlendirebilir ve ardından çalışma zamanı hatalarının nedenlerini belirlemek için yürütmeye satır satır devam edebilirsiniz. Bir composable işlevde kesme noktası ayarladığınızda hata ayıklayıcı, yeniden oluşturmaya hangi değişikliklerin neden olmuş olabileceğini belirlemenize yardımcı olmak için composable'ın parametrelerini ve durumunu listeler.
Alan kesme noktası
Alan kesme noktası, belirli bir alandan okuma veya bu alana yazma işlemi yapıldığında 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 alan koşullu kesme noktaları ayarlayabilirsiniz. Ayrıca, yürütmeyi askıya almadan Logcat'e yazan günlük kaydı kesme noktaları da ayarlayabilirsiniz. Bu, kodunuzu günlük ifadeleriyle doldurmaktan kaçınmanıza yardımcı olabilir.

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. Kod satırı boyunca sol oluğu tıklayın veya imleci satıra yerleştirip Control+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ıklamayı başlatmak 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.

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

Kod yürütmeniz kesme noktasına ulaştığında Android Studio, uygulamanızın yürütülmesini 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 kodda bir sonraki satıra geçmek için Adımı Atla'yı tıklayın.

  • Bir yöntem çağrısının içindeki ilk satıra gitmek için Adım İçine'yi tıklayın.

  • Geçerli yöntemin dışındaki bir sonraki satıra geçmek için Adım Dışarı'yı tıklayın.

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

Projenizde yerel kod kullanılıyorsa varsayılan olarak Hata Ayıklama Türünü Otomatik Olarak Algıla, Java hata ayıklayıcısını ve 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. Android Studio'nun kullandığı hata ayıklama türünü hata ayıklama yapılandırmanızı düzenleyerek 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 hata ayıklama penceresi, Ş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üyle açılır.

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

    İş parçacıkları bölmesi LLDB oturum görünümünde kullanılamasa da, Çerçeveler bölmesindeki listeyi kullanarak uygulama işlemlerinize erişebilirsiniz. Bu paneller hakkında daha fazla bilgiyi pencere çerçevelerinde hata ayıklama ve değişkenleri inceleme ile ilgili bölümlerde bulabilirsiniz.

    Not: Yerel kodunuzdaki bir kesme noktasını incelerken Android sistemi, uygulamanızın Java bayt kodunu çalıştıran sanal makineyi askıya alır. Bu nedenle, yerel kodunuzdaki bir kesme noktasını incelerken Java hata ayıklayıcısıyla etkileşimde bulunamaz veya Java hata ayıklayıcısı oturumunuzdan herhangi bir durum bilgisi alamazsınız.

  2. Android Studio, Java hata ayıklayıcısı Java veya Kotlin kodunuzda bir kesme noktasıyla karşılaştığında <your-module>-java sekmesine geçer.
  3. LLDB ile hata ayıklarken LLDB'ye komut satırı seçenekleri iletmek için LLDB oturum görünümündeki LLDB terminalini kullanabilirsiniz. LLDB'nin, uygulamanızda hata ayıklamaya her başladığınızda, hata ayıklayıcı uygulamanızın işlemine bağlanmadan hemen önce veya hemen sonra 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 türde kesme noktaları da ayarlayabilirsiniz. Bu kesme noktaları, uygulamanız belirli bir bellek bloğuyla etkileşime girdiğinde uygulama sürecinizi askıya alabilir. Daha fazla bilgi edinmek için izleme noktası ekleme hakkındaki 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 görünür.

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

Kesme noktaları penceresi, bölmedeki listeden her 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şıldığı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ışı kalacak şekilde yapılandırabilir ve sistemin, farklı bir kesme noktasına ulaşıldıktan sonra bu kesme noktasını etkinleştirmesini sağlayabilirsiniz. Ayrıca, bir kesme noktasına ulaşıldıktan sonra devre dışı bırakılıp bırakılmayacağını da yapılandırabilirsiniz. Herhangi bir istisna için kesme noktası ayarlamak üzere kesme noktaları listesinde Exception Breakpoints'i (İstisna Kesme Noktaları) seçin.

Tüm kesme noktalarını geçici olarak devre dışı bırakmak için hata ayıklama penceresinde Kesme Noktalarını Sessize Al tıklayın. Yeniden etkinleştirmek için tekrar tıklayın.

Hata ayıklama pencere çerçeveleri

Hata ayıklayıcı penceresindeki Kareler bölmesi, mevcut kesme noktasının tetiklenmesine neden olan yığın karesini incelemenize olanak tanır. Bu sayede, yığın çerçevesinde gezinebilir ve onu inceleyebilir, ayrıca Android uygulamanızdaki iş parçacıklarının listesini inceleyebilirsiniz.

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, Çerçeveleri İnceleme Kılavuzu'nda açıklandığı gibi iş parçacığı sunumunu özelleştirebilir ve yığın çerçevesini dışa aktarabilirsiniz.

Değişkenleri inceleme

Hata ayıklayıcı penceresindeki Değişkenler bölmesi, sistem uygulamanızı bir kesme noktasında durdurduğunda ve Çerçeveler bölmesinden bir çerçeve seçtiğinizde değişkenleri incelemenize olanak tanır. Değişkenler bölmesi, seçilen çerçevede bulunan 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ıklanı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ında izlemek istediğiniz ifade varsa bunu ağacın en üstüne sürükleyerek izlenen ifade olarak ekleyebilirsiniz.

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

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

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

Dikkat edilmesi gereken noktalar ekleme

C/C++ kodunda hata ayıklarken, uygulamanız belirli bir bellek bloğuyla etkileşime girdiğinde uygulama sürecinizi askıya alabilen izleme noktaları adı verilen özel türde kesme noktaları ayarlayabilirsiniz. Örneğin, bir bellek bloğuna iki işaretçi ayarlayıp bu bloğa 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şkene değil, yalnızca sistemin bu değişkene ayırdığı bellek bloğuna atar. Bu, değişkenin değerini gözlemlemenizi sağlayan ancak sistem değeri bellekte okuduğunda veya değiştirdiğinde uygulama sürecinizi askıya almanıza izin vermeyen, değişkeni İzleme penceresine eklemekten farklıdır.

Not: Uygulama süreciniz bir işlevden çıktığında ve sistem yerel değişkenlerini bellekten ayırdığında bu değişkenler için oluşturduğunuz tüm izleme noktalarını yeniden atamanız gerekir.

İzleme noktası ayarlamak için aşağıdaki koşulları 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 değişkeninizin bellekteki adresinin sınırını 32 bit işlemciler için 4 bayta, 64 bit işlemciler için ise 8 bayta hizalamanız gerekir. Yerel kodunuzdaki bir değişkeni hizalamak için aşağıdaki örnekte gösterildiği gibi değişken bildiriminde __attribute__((aligned(num_bytes))) değerini belirtin:
    // For a 64-bit ARM processor
    int my_counter __attribute__((aligned(8)));
  • Zaten üç veya daha az izleme noktası atamış olmanız gerekir. Android Studio yalnızca x86 veya x86_64 hedef cihazlarda en fazla dört izleme noktası destekler. Diğer cihazlar daha az izleme noktası destekleyebilir.

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

Koşulları karşılıyorsanız aşağıdaki şekilde izleme noktası ekleyebilirsiniz:

  1. Uygulamanız bir kesme noktasında askıya alınmışken LLDB oturum görünümünüzdeki Değişkenler bölmesine gidin.
  2. İzlemek istediğiniz bellek bloğunu kullanan 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ırmanıza yönelik bir iletişim kutusu görünür.

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

    • Etkin: Android Studio'nun ayarı değiştirene kadar izleme noktasını yoksaymasını 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, bir izleme noktasına atadığınız bellek bloğuna eriştiğinde varsayılan olarak uygulama sürecinizi askıya alır. Bu davranışın gerçekleşmesini istemiyorsanız bu seçeneğin işaretini kaldırın. Bu, sistem izleme noktanızla etkileşimde bulunduğunda davranışı özelleştirmek için kullanabileceğiniz ek seçenekleri gösterir: Log message to console (Konsola mesaj kaydet) ve Remove when hit (İsabet ettiğinde kaldır).
    • Erişim Türü: Uygulamanızın, sistemin değişkene ayırdığı bellek bloğuna Okuma veya Yazma işlemi yapmaya çalıştığında izleme noktanızı tetikleyip tetiklemeyeceğini seçin. İzleme noktanızı okuma veya yazma işleminde tetiklemek için Herhangi'yi 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, Kesme Noktaları iletişim kutusu görünür.

10. şekil. Kesme noktaları iletişim kutusunda mevcut izleme noktalarınız listelenir ve her birinin davranış ayarları yer alır.

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

Şekil 11. Android Studio, uygulamanızın bir izleme noktası 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 çerçeve seçiliyken aşağıdakileri yapın:

  1. Listeyi görüntülemek için Değişkenler listesinde bir kaynak satırını sağ tıklayın.
  2. Listede Görünüm'ü 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:

    • Class: Sınıf tanımını gösterir.
    • toString: Dize biçimini gösterir.
    • 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 bir kullanarak ikili değer gösterir.
    • MeasureSpec: Üst öğeden seçilen alt öğeye aktarılan değer. MeasureSpec sayfasına göz atın.
    • Onaltılık: Onaltılık değer olarak gösterilir.
    • İlkel: İlkel bir veri türü kullanarak sayısal değer olarak gösterin.
    • 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. Görüntüleme şekli'ni seçin.
  3. Oluştur'u seçin.
  4. Java Veri Türü Oluşturucuları iletişim kutusu gösterilir. Java Data type renderers (Java Veri Türü Oluşturucuları) bölümündeki talimatları uygulayın.