strace kullan

Strace, bir sürecin yaptığı sistem çağrılarını ve bu sistem çağrılarının döndürdüğü değerleri görmenizi sağlar.

Katman oluştur

strace'i derlemek için aşağıdakileri çalıştırın:

mmma -j6 external/strace

Çalışan bir sürece ekleme

strace'in en basit ve en yaygın kullanım alanı, çalışan bir işleme eklemektir. Bunu aşağıdaki yöntemlerle yapabilirsiniz:

adb shell strace -f -p PID

-f işareti, strace'e işlemdeki tüm iş parçacıklarına ve daha sonra ortaya çıkan yeni iş parçacıklarına eklemesini söyler.

Tipik bir işlem çok sayıda sistem çağrısı yapar. Bu nedenle, yalnızca ilgilendiğiniz verileri nasıl toplayacağınızı öğrenmek için strace man sayfasını incelemeniz gerekir.

Uygulamada kullanma

Bir uygulamada strace'i kullanmak için:

  1. Cihazı, strace'i çalıştırabilecek şekilde ayarlayın. strace'in çalışmasını engelleyen 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 kullanıcı kimliği altında çalışacağı için strace günlükleri için herkese açık yazılabilir 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 kullanın

Zigot üzerinde 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'in başlatılması sırasında strace günlüklerini alma

Android'in önyükleme sırasında strace günlüklerini almak için aşağıdaki değişiklikleri yapın:

  • İşlem adı zygote yerine strace olarak değiştiğinden, strace için SELinux file_context eksik olduğundan söz konusu hizmet başlatılamayabilir. Çözüm, system/sepolicy/private/file_contexts içinde satır için yeni bir satır ekleyip orijinal dosya bağlamını kopyalamaktır. Örnek:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • kernel veya bootconfig parametresini ekleyin, ardından cihazı SELinux izin verici modunda önyükleyin. Bu işlemi, androidboot.selinux=permissiveBOARD_KERNEL_CMDLINE öğesine ya da Android 12'de çekirdek sürümü 5.10 veya daha yeni olan BOARD_BOOTCONFIG öğesine ekleyerek yapabilirsiniz. (Bu değişken build/core/Makefile ürününde salt okunur olur ancak /device/*/BoardConfig altında her zaman kullanılabilir.)

    /device/google/marlin/sailfish/BoardConfig.mk bölgesindeki 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, önyükleme görüntüsünü derleyip flaşlayın. Böylece cihaz izin verilen modda önyüklenir.