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:
- 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
- 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
- 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"'
- 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
nastrace
, dana usługa może nie zostać uruchomiona z powodu brakufile_context
SELinux dlastrace
. Rozwiązaniem jest dodanie nowej linii 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 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.