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:
- 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
- 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
- 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"'
- 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
nastrace
, dana usługa może się nie uruchomić z powodu braku kontekstu SELinuxfile_context
dlastrace
. Rozwiązaniem jest dodanie nowego wiersza dla strace wsystem/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
doBOARD_KERNEL_CMDLINE
lub doBOARD_BOOTCONFIG
w Androidzie 12 z jądrem w wersji 5.10 lub nowszej. (Ta zmienna staje się tylko do odczytu wbuild/core/Makefile
, ale jest zawsze dostępna w/device/*/BoardConfig
).
Przykład dla urządzenia Pixel (sailfish) w/device/google/marlin/sailfish/BoardConfig.mk
: Po wprowadzeniu zmiany skompiluj i wgraj obraz rozruchowy, a urządzenie uruchomi się w trybie pobłażliwym.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive