SDV'de hata ayıklama

Bu kılavuzda, SDV platformunda çalışan hizmetlerin ve uygulamaların hata ayıklaması için gerekli araçlar ve teknikler hakkında genel bilgiler verilmektedir.

Cihaza bağlanma

Cihaza bağlanmak ve cihazla etkileşimde bulunmak için kullanılan temel araç Android Debug Bridge (adb)'dir. adb'nin sisteminizin yolunda olduğundan emin olun.

Ağı kullanarak bağlanma

Cihaz aynı ağdaysa ve IP adresini biliyorsanız Ethernet ile bağlanabilirsiniz. Sistemimiz, adb için yalnızca ağ bağlantılarını kullanır:

# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555

Birden fazla cihaza bağlanma

Tek bir iş istasyonundan birden fazla cihazı yönetmek için farklı IP adresleri üzerinden bu cihazlara bağlanabilirsiniz. Tek bir ana makinede birden fazla sanal makine çalıştırıyorsanız her cihaza farklı bağlantı noktaları atamanız gerekir. Bunun için her SDV cihazında adb arka plan programını benzersiz bir bağlantı noktasını (ör. ilk cihaz için 5555, ikinci cihaz için 5556) dinleyecek şekilde yapılandırmanız gerekir. Ayrıca, bu bağlantı noktalarını farklı konuklara yönlendirmek için ana makineyi de yapılandırabilirsiniz:

# Connect to the first device
adb connect <device_1_ip_address>:5555

# Connect to a second device
adb connect <device_2_ip_address>:5555

# Connect to a second VM on first device on different port
adb connect <device_1_ip_address>:5556

# List all connected devices to verify
adb devices

Sonraki adb komutlarını çalıştırırken -s işaretini tam adresiyle (ip:port) kullanarak belirli bir cihazı hedefleyebilirsiniz:

# Run a shell command on the second VM on first device in the above example
adb -s <device_1_ip_address>:5556 shell

Günlükleri göster

Bir hizmet başarısız olduğunda veya beklenmedik şekilde davrandığında önce günlükleri kontrol edin.

logcat'i (Android günlükleri) kullanma

logcat, sistem hizmetleri, aracıları ve hizmet paketlerinden gelen günlükleri gösterir:

# View all logs in real-time
adb logcat

# Filter logs by a specific tag (e.g., the name of your service)
adb logcat -s MyServiceTag

# Filter logs by priority (V: Verbose, D: Debug, I: Info, W: Warn, E: Error, F: Fatal)
# This shows only Error and Fatal messages for a specific tag
adb logcat MyServiceTag:E *:S

# Clear old logs before viewing new ones
adb logcat -c && adb logcat

# Show all logs and return
adb logcat -d

# Color logs by level
adb logcat -v color

# Show timestamps as time since boot
adb logcat -v monotonic

dmesg'yi (çekirdek günlükleri) kullanma

dmesg, Linux çekirdeğindeki günlükleri gösterir. Bu, aşağıdakileri ayıklamak için çok önemlidir:

  • Donanım ve sürücü sorunları
  • Çekirdek panikleri
  • SELinux reddetmeleri (avc: denied) - logcat'te de gösterilir
# View all kernel messages
adb shell dmesg

# Follow kernel messages in real-time
adb shell dmesg -w

Cuttlefish'teki erişim günlükleri

Cuttlefish sanal cihazında çalışırken ana makinenin dosya sistemindeki günlük dosyalarına doğrudan erişebilirsiniz. Bu, özellikle adb seçeneği kullanılamıyorsa yararlıdır. Cuttlefish'i başlattığınızda tüm hata ayıklama yollarını verir. Ayrıca, çalışan tüm örnekler için cvd fleet kullanarak bu yolları arayabilirsiniz.

  • Logcat (Android günlükleri): cuttlefish/instances/cvd-1/logs/logcat
  • Çekirdek günlükleri: cuttlefish/instances/cvd-1/logs/kernel.log
  • Cuttlefish başlatıcı günlükleri: cuttlefish/instances/cvd-1/logs/launcher.log (Cuttlefish ortamının kendisinde hata ayıklamak için kullanışlıdır)

Bu dosyaları gerçek zamanlı olarak görüntülemek için cat, less veya tail -f gibi standart komut satırı araçlarını kullanabilirsiniz.

Kabuk ve dosya sistemiyle etkileşim kurma

Komutları doğrudan cihazda çalıştırmak, işlem durumunu kontrol etmek ve dosya sisteminde gezinmek için kabuk erişimi elde edin:

# Open an interactive shell on the device
adb shell

# From within the shell, you can check running processes
ps -A

# Or check the status of a specific service managed by init
getprop init.svc.<service_name>

Dosya sistemi işlemleri gerçekleştirme

Dosyaları ana makineniz ile cihaz arasında taşımak için adb push ve adb pull tuşlarını kullanın. Test komut dosyalarını dağıtmak, yapılandırmayı güncellemek veya kilitlenme dökümlerini almak için bunu kullanın:

# Push a file from your computer to the device
adb push my_local_file.txt /data/local/tmp/

# Pull a file from the device to your computer
adb pull /data/tombstones/tombstone_00 .

Uygulamalarda hata ayıklama (C++/Rust)

Uygulamalarda hem çevrimiçi hem de çevrimdışı olarak hata ayıklayabilirsiniz.

Canlı hata ayıklama için lldb'yi kullanma

lldb, Android Studio'daki varsayılan hata ayıklayıcıdır ve genellikle modern C++ ve Rust geliştirmesi için tercih edilir.

Kurulum için aşağıdaki adımları uygulayın:

  1. Yönlendirmeye izin vermek için adb'yi yeniden başlatın (yönlendirme için gereklidir). Bağlantı noktası yönlendirmeyi ayarlamak için bunu kullanın. Ana makinede şunu çalıştırın:

    adb root
    
  2. Bir ikilide hata ayıklama sembolleri varsa sembolleri kaldırılmamış bir sürümü gönderin. Şeridi kaldırılmamış sürümü out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE] adresinde bulabilirsiniz. Örneğin, system_ext ve sdv_core_cf konumlarından rpcagent dosyasını yüklemek için şu komutu çalıştırın:

    adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmp
    

    Şimdi, kaldırılmamış sürüm /data/local/tmp içinde.

  3. lldbclient.py kolaylık komut dosyasını kullanarak LLDB istemcisine bağlanın:

    # Run and connect a binary on device, run on host:
    lldbclient.py -r /data/local/tmp/rpcagent
    
    # Connect to an existing process with PID 2759
    lldbclient.py -p 2759
    

    Bu komut dosyası, lldb'yi uzaktan bağlar. Kullanılabilir tüm bayraklar için lldbclient.py komutunu çalıştırın. IDE'nizi lldb'ye bağlamak için IDE dokümanlarınıza bakın.

Kilitlenme dökümlerini (mezartaşları) analiz etme

Bir hizmet kilitlendiğinde /data/tombstones/ içinde tombstone dosyası oluşturulur. Dosya; yığın izleme, bellek haritası ve diğer önemli bilgileri içerir.

Mezar taşı dosyasını çekin, ardından ikilinin şeritlenmemiş sürümüyle analiz etmek için sembolleri algılayan bir araç (ör. lldb veya özel bir komut dosyası) kullanın.

Performansı analiz etme

SDV, performans ölçümleri için birden fazla aracı destekler.

CPU ve bellek kullanımını kontrol etme

  • top: CPU kullanımına göre sıralanmış çalışan işlemlerin anlık görünümünü sağlar.

    adb shell top -m 10  # Show top 10 processes
    
  • procrank: Belirli bir işlem veya tüm sistem için bellek kullanımının ayrıntılı bir dökümünü sağlar.

    adb shell procrank
    

Hizmet durumu için dumpsys'i kullanma

dumpsys, herhangi bir Android sistem hizmetinin dahili durumunu sorgulamak için kullanılan güçlü bir araçtır.

# List all available services
adb shell dumpsys -l

# Dump the state of a specific service or agent
adb shell dumpsys <service_name>

Performans analizi için torq'u kullanma

torq, Android'de profil oluşturma ve izleme görevlerini basitleştiren bir komut satırı aracıdır. Sistem performansı analizi sırasında Simpleperf, Perfetto ve diğer tipik görevlerin çalıştırılmasına olanak tanır.

İzleme için Perfetto'yu kullanma

Perfetto, Android'de sistem genelinde izleme için kullanılan standart araçtır. Perfetto, sistem etkinliklerini, uygulama düzeyindeki izleme noktalarını ve performans sayaçlarını kaydetmenize ve bunları bir zaman çizelgesinde görselleştirmenize olanak tanır.

Önemli adımlar:

  1. C++ veya Rust kodunuza izleme noktaları ekleyin:
    • C++: Perfetto SDK'sını TRACE_EVENT makrolarıyla kullanın.
    • Rust: Perfetto ile uyumlu ATrace etkinlikleri yayınlayan tracing sandığını kullanın.
  2. Veri kaynaklarını (örneğin, ftrace, track_event), kategorileri ve etiketleri belirtmek için bir textproto yapılandırma dosyası oluşturun.
  3. Cihazdaki izlemeyi yakalamak için yapılandırma dosyanızla birlikte record_android_trace komut dosyasını (external/perfetto/tools/record_android_trace) kullanın.
  4. Sistem davranışını analiz etmek, darboğazları belirlemek ve hizmet etkileşimlerini anlamak için oluşturulan izleme dosyasını Perfetto Web kullanıcı arayüzünde açın.

Enstrümantasyon, yapılandırma ve toplama ile ilgili ayrıntılı talimatlar için Sistem performansıyla ilgili analizler elde etmek için izlemeyi kullanma başlıklı makaleyi inceleyin.

Profil oluşturmak için Simpleperf'ü kullanma

Simpleperf, Linux perf'e benzer şekilde Android'de performans profili oluşturma için çok yönlü bir komut satırı aracıdır.

Yaygın kullanım alanları:

  • CPU profili oluşturma: En fazla CPU süresini tüketen işlevleri belirleyin.
  • CPU dışı analiz: İş parçacıklarının neden uyuduğunu veya engellendiğini analiz edin.
  • Donanım sayaçları: Donanım performans sayaçlarına erişin.

Örnek komutlar:

# Go to simpleperf scripts
cd system/extras/simpleperf/scripts

# Profile system for 20 seconds and record call graph
./app_profiler.py --system_wide -r "--call-graph fp --duration 20"

# Record a profile for a specific process (PID 1)
./app_profiler.py --pid 1 -r "--call-graph fp --duration 5"

# Pull the profile data
adb pull /data/local/tmp/perf.data .

# Generate a report with symbol resolution
./report_html.py --add_source_code --source_dirs $ANDROID_BUILD_TOP --add_disassembly -o report.html

Simpleperf çok daha fazla etkinlik ve seçenek sunar. Kapsamlı dokümanlar için Simpleperf kılavuzuna bakın.

SELinux retleri

Belirti: Hizmetiniz başlatılamıyor, bir dosyaya erişilemiyor veya bir özellik kullanılamıyor ve dmesg ya da logcat içinde avc: denied mesajı gösteriliyor.

[ 123.456] avc: denied { read } for pid=789 comm="my_service" name="some_file" dev="sda1" ino=123 scontext=u:r:my_service_t:s0 tcontext=u:object_r:some_file_t:s0 tclass=file permissive=0

Hızlı hata ayıklama (yalnızca geliştirme için)

Sorunun çözülüp çözülmediğini görmek için SELinux'un zorunlu kılınmasını geçici olarak devre dışı bırakabilirsiniz. Bu, sorunun eksik bir SELinux politikası kuralından kaynaklandığını doğrular.

# Disabling SELinux requires root permission
adb root

# Set SELinux to permissive mode
adb shell setenforce 0

# Check the current mode (should return "Permissive")
adb shell getenforce

Düzeltme: Reddetme mesajındaki Android kaynak ağacından audit2allow aracını kullanın. Bu işlem, cihazınızın SELinux yapılandırmasına eklenecek doğru .te politika kuralını oluşturur.