Menggunakan Strace

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

Membangun stras

Untuk membangun strace, jalankan yang berikut:

mmma -j6 external/strace

Melampirkan ke proses yang sedang berjalan

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

adb shell strace -f -p PID

Bendera -f memberi tahu strace untuk dilampirkan ke semua utas dalam proses, ditambah utas baru yang muncul nanti.

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

Menggunakan pada aplikasi

Untuk menggunakan strace pada aplikasi:

  1. Siapkan perangkat sehingga 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 dunia untuk log strace, karena strace akan berjalan di bawah uid aplikasi:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Pilih proses untuk melacak dan meluncurkannya:
    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.

Menggunakan pada zigot

Untuk menggunakan strace pada zigot, perbaiki baris zigot 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 strace log selama Android boot

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

  • Karena nama proses berubah dari zygote menjadi strace , layanan yang diberikan mungkin gagal untuk memulai karena tidak ada SELinux file_context untuk strace . 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 boot 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 kernel versi 5.10 atau lebih tinggi. (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 : l10n
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Setelah melakukan perubahan, buat dan flash image boot dan perangkat akan boot dalam mode permisif.