SDV'de hata ayıklama

Bu kılavuzda, SDV platformunda çalışan hizmet ve uygulamalarda hata ayıklama için gerekli araç ve tekniklere genel bir bakış sunulmaktadır.

Cihaza bağlanma

Cihaza bağlanmak ve cihazla etkileşim kurmak için kullanılan birincil araç Android Debug Bridge (adb)'dir. adb aracının sisteminizin yolunda olduğunu doğrulayın.

Ağı kullanarak bağlanma

Cihaz aynı ağdaysa ve IP adresini biliyorsanız Ethernet üzerinden 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. Bu işlem için her SDV cihazındaki adb daemon'un benzersiz bir bağlantı noktasını (ör. ilk cihaz için 5555 ve ikinci cihaz için 5556) dinleyecek şekilde yapılandırılması gerekir. Ana makineyi, bu bağlantı noktalarını farklı konuklara yönlendirecek şekilde 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 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 (çekirdek günlükleri) kullanma

dmesg, Linux çekirdeğindeki günlükleri gösterir. Bu, aşağıdakilerle ilgili hata ayıklama işlemleri için çok önemlidir:

  • Donanım ve sürücü sorunları
  • Kernel panic hataları
  • SELinux retleri (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'te günlüklere erişme

Cuttlefish sanal cihazında çalışırken günlük dosyalarına doğrudan ana makinenin dosya sisteminden erişebilirsiniz. Bu, özellikle adb kullanılamıyorsa yararlıdır. Cuttlefish'i başlattığınızda tüm hata ayıklama yollarını gösterir. 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ında hata ayıklama 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

Ana makineniz ile cihaz arasında dosya taşımak için adb push ve adb pull komutlarını kullanın. Test komut dosyalarını dağıtmak, yapılandırmayı güncellemek veya kilitlenme dökümlerini almak için bu seçeneği 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 online veya çevrimdışı olarak hata ayıklayabilirsiniz.

Canlı hata ayıklama için lldb kullanma

lldb kullanarak bir hizmette gerçek zamanlı olarak hata ayıklamak için aşağıdaki adımları uygulayın (Android Studio for Platform'dan hata ayıklayıcıyı eklemek için Hata ayıklama ve test etme ve Platform kodunda hata ayıklama bölümlerine bakın):

  1. adb'i root izinleriyle yeniden başlatın (bağlantı noktası yönlendirme için gereklidir):

    adb root
    
  2. İkili programda hata ayıklama sembolleri varsa out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE] üzerinden çıkarılmamış bir sürüm gönderin. Örneğin, system_ext ve sdv_core_cf'den rpcagent 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
    
  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 cihazına uzaktan bağlanır. Kullanılabilir tüm işaretler için lldbclient.py --help komutunu çalıştırın.

Kilitlenme dökümlerini (tombstone) analiz etme

Bir hizmet kilitlendiğinde /data/tombstones/ içinde bir tombstone dosyası oluşturulur. Dosyada yığın izleme (stack trace), bellek haritası ve diğer önemli bilgiler yer alır.

Tombstone dosyasını alın, ardından simge kullanan bir araçla (ör. lldb veya özel bir komut dosyası) ikili programın çıkarılmamış sürümüyle analiz edin.

Performansı analiz etme

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

CPU ve bellek kullanımını kontrol etme

  • top: Çalışan işlemlerin CPU kullanımına göre sıralanmış gerçek zamanlı bir görünümünü sağlar.

    adb shell top -m 10  # Show top 10 processes
    
  • procrank: Belirli bir işlem veya sistemin tamamı için bellek kullanımının ayrıntılı 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 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 standart araçtır. Perfetto, sistem etkinliklerini, uygulama düzeyindeki izleme noktalarını ve performans sayaçlarını kaydedip zaman çizelgesinde görselleştirmenize olanak tanır.

Temel adımlar:

  1. C++ veya Rust kodunuza izleme noktaları ekleyin:
    • C++: Perfetto SDK'yı TRACE_EVENT makrolarıyla kullanın.
    • Rust: Perfetto ile uyumlu ATrace etkinlikleri yayınlayan tracing paketini kullanın.
  2. Veri kaynaklarını (ör. ftrace, track_event), kategorileri ve etiketleri belirtmek için bir textproto yapılandırma dosyası oluşturun.
  3. Cihazdan 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.

İzleme, 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'i kullanma

Simpleperf, Linux perf'e benzer şekilde Android'de performans profili oluşturmak için kullanılan ç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 uyku modunda veya engellendiğini analiz edin.
  • Donanım sayaçları: Donanım performans sayaçlarına erişme

Ö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, daha birçok etkinlik ve seçenek sunar. Kapsamlı dokümanlar için Simpleperf kılavuzuna bakın.

SELinux reddetmeleri

Belirti: Hizmetiniz başlatılamıyor, bir dosyaya erişemiyor veya bir özelliği kullanamıyor ve dmesg ya da logcat içinde bir avc: denied mesajı görüyorsunuz.

[ 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 yaptırımını geçici olarak devre dışı bırakabilirsiniz. Bu, sorunun eksik bir SELinux politika 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: Red mesajındaki Android kaynak ağacından audit2allow aracı. Bu işlem, cihazınızın SELinux yapılandırmasına eklenecek doğru .te politika kuralını oluşturur.