Mit Strace können Sie die Systemaufrufe eines Prozesses und die Rückgabewerte dieser Systemaufrufe sehen.
strace erstellen
Führen Sie zum Erstellen von strace Folgendes aus:
mmma -j6 external/strace
An einen laufenden Prozess anhängen
Der einfachste und häufigste Anwendungsfall für strace besteht darin, es an einen laufenden Prozess anzuhängen. Dazu haben Sie folgende Möglichkeiten:
adb shell strace -f -p PID
Das Flag -f
weist strace an, sich an alle Threads im Prozess sowie an alle neuen Threads anzuhängen, die später erstellt werden.
Ein typischer Prozess führt viele Systemaufrufe aus. Lesen Sie daher die Manpage für strace, um zu erfahren, wie Sie nur Daten erfassen, die Sie tatsächlich interessieren.
Für eine App verwenden
So verwenden Sie strace für eine App:
- Richten Sie das Gerät so ein, dass Sie strace ausführen können. Sie müssen Root-Benutzer 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 von allen 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 Prozess aus, den Sie erfassen möchten, 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 wie gewohnt.
Im Zygote verwenden
Wenn Sie strace für den Zygote verwenden möchten, korrigieren Sie die entsprechende init.rc
-Zeile des Zygote (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
Wenn Sie strace-Protokolle während des Android-Starts abrufen möchten, nehmen Sie die folgenden Änderungen vor:
- Da sich der Prozessname von
zygote
instrace
ändert, kann der Dienst aufgrund des fehlenden SELinux-file_context
fürstrace
nicht gestartet werden. Die Lösung besteht darin, insystem/sepolicy/private/file_contexts
eine 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 den Kernel- oder Bootconfig-Parameter hinzu und starten Sie das Gerät dann im SELinux-Permissivmodus. Dazu fügen Sie
androidboot.selinux=permissive
zuBOARD_KERNEL_CMDLINE
oder zuBOARD_BOOTCONFIG
in Android 12 mit der Kernelversion 5.10 oder höher hinzu. Diese Variable ist inbuild/core/Makefile
schreibgeschützt, aber unter/device/*/BoardConfig
immer verfügbar.
Beispiel für das Pixel (Sailfish)-Gerät in/device/google/marlin/sailfish/BoardConfig.mk
: Nachdem Sie die Änderung vorgenommen haben, erstellen und flashen Sie 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