strace'i kullanma

Strace, bir işlemin yaptığı sistem çağrılarını ve bu sistem çağrılarının döndürdüklerini görmenizi sağlar.

strace oluşturma

strace'i oluşturmak için aşağıdaki komutu çalıştırın:

mmma -j6 external/strace

Çalışan bir işleme ekleme

strace'in en basit ve en yaygın kullanım alanı, onu çalışan bir işleme eklemektir. Bunu şu komutla yapabilirsiniz:

adb shell strace -f -p PID

-f işareti, strace'e süreçteki tüm iş parçacıklarının yanı sıra daha sonra oluşturulan tüm yeni iş parçacıklarına bağlanmasını söyler.

Tipik bir işlemde çok sayıda sistem çağrısı yapılır. Bu nedenle, yalnızca gerçekten ilgilendiğiniz verileri nasıl toplayacağınızı öğrenmek için strace kılavuz sayfasını incelemeniz gerekir.

Uygulamada kullanma

Bir uygulamada strace'i kullanmak için:

  1. Cihazı, strace'i çalıştırabileceğiniz şekilde ayarlayın. Aksi takdirde strace'in çalışmasını engelleyecek olan seccomp filtresini kaldırmak için root olmanız, SELinux'u devre dışı bırakmanız ve çalışma zamanını yeniden başlatmanız gerekir:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. strace, uygulamanın uid'si altında çalışacağından strace günlükleri için herkese yazma izni olan bir dizin oluşturun:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. İzlenecek işlemi seçin ve başlatın:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. İşlemi normal şekilde başlatın.

Zigotta kullanma

Zygote'ta strace'i kullanmak için ilgili init.rc zygote satırını düzeltin (adb shell setenforce 0 gerekir):

cd system/core/
patch -p1 <<EOF
--- a/rootdir/init.zygote32.rc
+++ b/rootdir/init.zygote32.rc
@@ -1,4 +1,4 @@
-service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
+service zygote /system/bin/strace -o /data/local/tmp/zygote.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
     class main
     socket zygote stream 660 root system
     onrestart write /sys/android_power/request_state wake
EOF

Android başlatma sırasında strace günlüklerini alma

Android başlatma sırasında strace günlüklerini almak için aşağıdaki değişiklikleri yapın:

  • İşlem adı zygote olarak değiştiğinden, strace için SELinux file_context eksik olduğu için belirtilen hizmet başlatılamayabilir.strace Çözüm olarak, system/sepolicy/private/file_contexts içinde strace için yeni bir satır ekleyin ve orijinal dosya bağlamını kopyalayın. Örnek:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • Çekirdek veya bootconfig parametresi ekleyin, ardından cihazı SELinux izinli modunda başlatın. Bunu, Android 12'de çekirdek sürümü 5.10 veya daha yeni olan cihazlarda androidboot.selinux=permissive öğesini BOARD_KERNEL_CMDLINE ya da BOARD_BOOTCONFIG öğesine ekleyerek yapabilirsiniz. (Bu değişken build/core/Makefile içinde salt okunur hale gelir ancak her zaman /device/*/BoardConfig altında kullanılabilir.)

    /device/google/marlin/sailfish/BoardConfig.mk içindeki Pixel (sailfish) cihazı için örnek:
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Değişikliği yaptıktan sonra başlatma görüntüsünü oluşturup cihaza yükleyin. Cihaz, izinli modda başlatılır.