Mit strace können Sie die Systemaufrufe eines Prozesses und die Rückgabewerte dieser Systemaufrufe sehen.
strace erstellen
Führen Sie Folgendes aus, um strace zu erstellen:
mmma -j6 external/strace
An einen laufenden Prozess anhängen
Der einfachste und häufigste Anwendungsfall für strace ist das Anhängen an einen laufenden Prozess. Dazu haben Sie folgende Möglichkeiten:
adb shell strace -f -p PID
Das Flag -f weist strace an, alle Threads im Prozess sowie alle später erstellten neuen Threads anzuhängen.
Ein typischer Prozess führt viele Systemaufrufe aus. Lesen Sie daher die strace-Manpage , um zu erfahren, wie Sie nur die Daten erfassen, die Sie wirklich interessieren.
In einer App verwenden
So verwenden Sie strace in einer App:
- 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 rootadb shell setenforce 0adb shell stopadb shell start - Richten Sie ein für alle beschreibbares Verzeichnis für strace-Logs 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 Prozess normal.
In der Zygote verwenden
Wenn Sie strace in der Zygote verwenden möchten, korrigieren Sie die entsprechende init.rc-Zygote-Zeile (adb shell setenforce 0 erforderlich):
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-Logs während des Android-Starts abrufen
Nehmen Sie die folgenden Änderungen vor, um strace-Logs während des Android-Starts abzurufen:
- Da sich der Prozessname von
zygoteinstraceändert, kann der angegebene Dienst möglicherweise nicht gestartet werden, da der SELinux-file_contextfürstracefehlt. Die Lösung besteht darin, insystem/sepolicy/private/file_contextseine neue Zeile für strace 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 einen Kernel- oder Bootconfig-Parameter hinzu und starten Sie das Gerät im permissiven SELinux-Modus. Dazu können Sie
androidboot.selinux=permissivezuBOARD_KERNEL_CMDLINEoder in Android 12 mit Kernel-Version 5.10 oder höher zuBOARD_BOOTCONFIGhinzufügen. (Diese Variable wird inbuild/core/Makefileschreibgeschützt, ist aber immer unter/device/*/BoardConfigverfügbar.)
Beispiel für das Pixel-Gerät (sailfish) in/device/google/marlin/sailfish/BoardConfig.mk: Erstellen und flashen Sie nach der Änderung das Boot-Image. Das Gerät wird dann im permissiven Modus gestartet.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive