strace'i kullanma

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.

strace oluşturma

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 mesaj dizilerine ve daha sonra oluşturulan yeni mesaj dizilerine bağlanmasını 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 işlemi 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

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 ö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 dosyasına strace için yeni bir satır eklemek ve 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. Bunu, androidboot.selinux=permissiveBOARD_KERNEL_CMDLINE'e veya Android 12'de çekirdek sürümü 5.10 veya daha yeni bir sürümle BOARD_BOOTCONFIG'ye ekleyerek yapabilirsiniz. (Bu değişken build/core/Makefile'te salt okunur hale gelir ancak /device/*/BoardConfig altında her zaman kullanılabilir.)

    /device/google/marlin/sailfish/BoardConfig.mk'teki 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.