Mit Strace können Sie sehen, welche Systemaufrufe ein Prozess ausführt und was diese Systemaufrufe zurückgeben.
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 können Sie Folgendes verwenden:
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.
In einer 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 sein, SELinux deaktivieren und die Laufzeit neu starten, um den seccomp-Filter zu entfernen, der sonst die Ausführung von strace verhindert:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Richten Sie ein Verzeichnis für strace-Logs ein, das von allen Nutzern geschrieben werden kann, da strace unter der UID der Anwendung 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 auf dem 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
Nehmen Sie die folgenden Änderungen vor, um strace-Logs während des Android-Starts zu erhalten:
- 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 einen Kernel- oder bootconfig-Parameter hinzu und starten Sie dann das Gerät im SELinux-Moderationsmodus. Dazu fügen Sie
androidboot.selinux=permissive
zuBOARD_KERNEL_CMDLINE
oder zuBOARD_BOOTCONFIG
in Android 12 mit Kernelversion 5.10 oder höher hinzu. (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
: 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