Korzystanie ze Strace’a

Strace pozwala zobaczyć wywołania systemowe wykonywane przez proces i to, co te wywołania systemowe zwracają.

Budynek strace

Aby zbudować strace, uruchom następujące polecenie:

mmma -j6 external/strace

Dołączanie do działającego procesu

Najprostszym i najczęstszym przypadkiem użycia strace jest dołączenie go do działającego procesu, co można zrobić za pomocą:

adb shell strace -f -p PID

Flaga -f mówi strace, aby dołączyła się do wszystkich wątków procesu oraz wszelkich nowych wątków, które pojawią się później.

Typowy proces wykonuje wiele wywołań systemowych, dlatego warto przejrzeć stronę podręcznika strace, aby dowiedzieć się, jak zbierać tylko te dane, które Cię rzeczywiście interesują.

Używanie w aplikacji

Aby użyć strace w aplikacji:

  1. Skonfiguruj urządzenie tak, aby można było uruchomić strace. Musisz być rootem, wyłączyć SELinux i zrestartować środowisko wykonawcze, aby usunąć filtr seccomp, który w przeciwnym razie uniemożliwi uruchomienie strace:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Skonfiguruj katalog do zapisu dla wszystkich dzienników strace, ponieważ strace będzie działać pod identyfikatorem użytkownika aplikacji:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Wybierz proces do prześledzenia i uruchom go:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. Uruchom proces normalnie.

Używanie na zygocie

Aby użyć strace na zygocie, napraw odpowiednią linię zygoty init.rc (wymaga 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

Pobieranie dzienników strace podczas uruchamiania systemu Android

Aby uzyskać dzienniki strace podczas uruchamiania systemu Android, wprowadź następujące zmiany:

  • Ponieważ nazwa procesu zmienia się z zygote na strace , dana usługa może nie zostać uruchomiona z powodu braku file_context SELinux dla strace . Rozwiązaniem jest dodanie nowej linii dla strace w system/sepolicy/private/file_contexts i skopiowanie oryginalnego kontekstu pliku. Przykład:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • Dodaj parametr jądra lub bootconfig, a następnie uruchom urządzenie w trybie zezwalającym SELinux. Możesz to zrobić, dodając androidboot.selinux=permissive do BOARD_KERNEL_CMDLINE lub do BOARD_BOOTCONFIG w Androidzie 12 z jądrem w wersji 5.10 lub nowszej. (Ta zmienna staje się tylko do odczytu w build/core/Makefile , ale zawsze jest dostępna w /device/*/BoardConfig .)

    Przykład dla urządzenia Pixel (sailfish) w /device/google/marlin/sailfish/BoardConfig.mk :
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Po dokonaniu zmiany zbuduj i wgraj obraz startowy, a urządzenie uruchomi się w trybie zezwalającym.