Używanie strace

Strace umożliwia wyświetlanie wywołań systemowych wykonywanych przez proces i ich wyników.

Budowanie strace

Aby skompilować strace, uruchom to polecenie:

mmma -j6 external/strace

Dołączanie do działającego procesu

Najprostszy i najczęstszy przypadek użycia narzędzia strace to dołączenie go do działającego procesu, co można zrobić za pomocą tego polecenia:

adb shell strace -f -p PID

Flaga -f informuje narzędzie strace, że ma się ono dołączyć do wszystkich wątków w procesie, a także do wszystkich nowych wątków utworzonych później.

Typowy proces wykonuje wiele wywołań systemowych, więc warto zapoznać się z stroną podręcznika strace, aby dowiedzieć się, jak zbierać tylko te dane, które Cię interesują.

Używanie w aplikacji

Aby użyć narzędzia strace w przypadku aplikacji:

  1. Skonfiguruj urządzenie tak, aby można było uruchomić strace. Aby usunąć filtr seccomp, który w przeciwnym razie uniemożliwi uruchomienie narzędzia strace, musisz mieć uprawnienia roota, wyłączyć SELinux i ponownie uruchomić środowisko wykonawcze:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Skonfiguruj katalog z uprawnieniami do zapisu dla wszystkich użytkowników na potrzeby logów strace, ponieważ strace będzie działać z identyfikatorem użytkownika aplikacji:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Wybierz proces do śledzenia i go uruchom:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. Uruchom proces w zwykły sposób.

Użycie na zygocie

Aby użyć strace na procesie zygote, popraw odpowiednią linię init.rc zygote (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 Androida

Aby uzyskać dzienniki strace podczas uruchamiania Androida, wprowadź te zmiany:

  • Ponieważ nazwa procesu zmienia się z zygote na strace, dana usługa może się nie uruchomić z powodu braku kontekstu SELinux file_context dla strace. Rozwiązaniem jest dodanie nowego wiersza 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=permissivedo 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 jest zawsze 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 wprowadzeniu zmiany skompiluj i wgraj obraz rozruchowy, a urządzenie uruchomi się w trybie pobłażliwym.