Menggunakan strace

Strace memungkinkan Anda melihat panggilan sistem yang dibuat proses dan apa yang ditampilkan panggilan sistem tersebut.

Bangun strace

Untuk mem-build strace, jalankan perintah berikut:

mmma -j6 external/strace

Pasang ke proses yang sedang berjalan

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

adb shell strace -f -p PID

Flag -f memberi tahu strace untuk dipasang ke semua thread di {i>tool<i}, ditambah utas baru apa pun yang muncul kemudian.

Biasanya, proses melakukan banyak panggilan sistem, jadi Anda perlu meninjau halaman manual strace untuk mempelajari cara mengumpulkan hanya data yang benar-benar Anda minati.

Gunakan di aplikasi

Untuk menggunakan strace di aplikasi:

  1. Siapkan perangkat agar Anda dapat menjalankan strace. Anda harus melakukan 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 dunia 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. Meluncurkan proses seperti biasa.

Penggunaan di zygote

Untuk menggunakan strace di zygote, perbaiki zygote init.rc yang relevan baris (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 parameter SELinux file_context untuk strace. Solusinya adalah menambahkan baris baru untuk strace di system/sepolicy/private/file_contexts dan salin 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=permissive ke BOARD_KERNEL_CMDLINE, atau ke BOARD_BOOTCONFIG di Android 12 dengan versi kernel 5.10 atau yang lebih baru. (Variabel ini menjadi hanya baca di build/core/Makefile, tetapi selalu tersedia di bawah /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, build dan flash image booting dan perangkat akan melakukan booting dalam mode permisif.