Menggunakan strace

Strace memungkinkan Anda melihat panggilan sistem yang dilakukan suatu proses dan apa yang dikembalikan oleh panggilan sistem tersebut.

Membangun strace

Untuk membuat strace, jalankan perintah berikut:

mmma -j6 external/strace

Memasang ke proses yang sedang berjalan

Kasus penggunaan strace yang paling sederhana dan umum adalah melampirkannya ke proses yang sedang berjalan, yang dapat Anda lakukan dengan:

adb shell strace -f -p PID

Flag -f memberi tahu strace untuk melampirkan ke semua thread dalam proses, serta thread baru yang dibuat nanti.

Proses umum membuat banyak panggilan sistem, jadi Anda harus meninjau halaman manual strace untuk mempelajari cara mengumpulkan hanya data yang benar-benar Anda minati.

Menggunakan di aplikasi

Untuk menggunakan strace di aplikasi:

  1. Siapkan perangkat agar Anda dapat menjalankan strace. Anda harus menjadi root, menonaktifkan SELinux, dan memulai ulang runtime untuk menghapus filter seccomp yang akan mencegah strace berjalan:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Siapkan direktori yang dapat ditulis oleh semua orang untuk log strace, karena strace akan berjalan di bawah uid aplikasi:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Pilih proses yang akan dilacak dan luncurkan:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. Luncurkan proses secara normal.

Penggunaan pada zigot

Untuk menggunakan strace pada zygote, perbaiki baris zygote init.rc yang relevan (memerlukan adb shell setenforce 0):

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

Mendapatkan log strace selama booting Android

Untuk mendapatkan log strace selama booting Android, lakukan perubahan berikut:

  • Karena nama proses berubah dari zygote menjadi strace, layanan yang diberikan mungkin gagal dimulai karena file_context SELinux untuk strace tidak ada. Solusinya adalah menambahkan baris baru untuk strace di system/sepolicy/private/file_contexts dan menyalin konteks file asli. Contoh:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • Tambahkan parameter kernel atau bootconfig, lalu booting perangkat dalam mode permisif SELinux. Anda dapat melakukannya dengan menambahkan androidboot.selinux=permissiveke BOARD_KERNEL_CMDLINE, atau ke BOARD_BOOTCONFIG di Android 12 dengan kernel versi 5.10 atau yang lebih baru. (Variabel ini menjadi hanya baca di build/core/Makefile, tetapi selalu tersedia di /device/*/BoardConfig.)

    Contoh untuk perangkat Pixel (sailfish) di /device/google/marlin/sailfish/BoardConfig.mk:
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Setelah melakukan perubahan, bangun dan flash image boot, lalu perangkat akan melakukan booting dalam mode permisif.