Mit Strace können Sie sehen, welche Systemaufrufe ein Prozess ausführt und was diese Systemaufrufe zurückgeben.
Gebäudestraße
Um Strace zu erstellen, führen Sie Folgendes aus:
mmma -j6 external/strace
Anhängen an einen laufenden Prozess
Der einfachste und häufigste Anwendungsfall für Strace besteht darin, es an einen laufenden Prozess anzuhängen, was Sie wie folgt tun können:
adb shell strace -f -p PID
Das Flag -f
weist Strace an, sich an alle Threads im Prozess sowie an alle später erzeugten neuen Threads anzuhängen.
Ein typischer Prozess führt viele Systemaufrufe aus, daher sollten Sie die Strace-Manpage lesen, um zu erfahren, wie Sie nur die Daten sammeln, die Sie tatsächlich interessieren.
Verwendung in einer Anwendung
So verwenden Sie Strace für eine Anwendung:
- Richten Sie das Gerät so ein, dass Sie strace ausführen können. Sie müssen Root sein, SELinux deaktivieren und die Laufzeit neu starten, um den Seccomp-Filter zu entfernen, der andernfalls die Ausführung von Strace verhindert:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Richten Sie ein weltweit beschreibbares Verzeichnis für Strace-Protokolle ein, da Strace unter der UID der App ausgeführt wird:
adb shell mkdir -m 777 /data/local/tmp/strace
- Wählen Sie den zu verfolgenden Prozess aus und starten Sie ihn:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Starten Sie den Vorgang normal.
Verwendung auf der Zygote
Um Strace auf der Zygote zu verwenden, korrigieren Sie die entsprechende init.rc
Zygote-Zeile (erfordert 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
Strace-Protokolle während des Android-Starts abrufen
Um Strace-Protokolle während des Android-Starts abzurufen, nehmen Sie die folgenden Änderungen vor:
- Da sich der Prozessname von
zygote
instrace
ändert, kann es sein, dass der angegebene Dienst aufgrund des fehlenden SELinux-file_context
fürstrace
nicht gestartet werden kann. Die Lösung besteht darin, eine neue Zeile für strace insystem/sepolicy/private/file_contexts
hinzuzufügen und den ursprünglichen Dateikontext zu kopieren. Beispiel:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- Fügen Sie den Kernel- oder Bootconfig-Parameter hinzu und starten Sie das Gerät dann im permissiven SELinux-Modus. Sie können dies tun, indem Sie
androidboot.selinux=permissive
zuBOARD_KERNEL_CMDLINE
oder zuBOARD_BOOTCONFIG
in Android 12 mit Kernel-Version 5.10 oder höher hinzufügen. (Diese Variable wird inbuild/core/Makefile
schreibgeschützt, ist aber immer unter/device/*/BoardConfig
verfügbar.)
Beispiel für das Pixel-Gerät (Sailfish) in/device/google/marlin/sailfish/BoardConfig.mk
:- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
Nachdem Sie die Änderung vorgenommen haben, erstellen und flashen Sie das Boot-Image und das Gerät startet im permissiven Modus.