Mit Strace können Sie die Systemaufrufe eines Prozesses und die Rückgabe 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. Das geht so:
adb shell strace -f -p PID
Das Flag -f
weist strace an, alle Threads im Prozess sowie alle später erstellten neuen Threads zu überwachen.
Ein typischer Prozess führt zu vielen Systemaufrufen. Lesen Sie daher die strace-Manpage, um zu erfahren, wie Sie nur die Daten erfassen, die Sie tatsächlich benötigen.
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 andernfalls die Ausführung von „strace“ verhindert:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Richten Sie ein von jedem 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 Prozess aus, den Sie verfolgen 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.
In der Zygote verwenden
Wenn Sie „strace“ für den Zygote-Prozess verwenden möchten, 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-Logs während des Android-Boots abrufen
Wenn Sie strace-Logs während des Android-Bootvorgangs abrufen möchten, nehmen Sie die folgenden Änderungen vor:
- Da sich der Prozessname von
zygote
instrace
ändert, kann der angegebene Dienst möglicherweise nicht gestartet werden, da das SELinux-file_context
fürstrace
fehlt. 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 das Gerät im SELinux-Modus „Permissive“. Dazu können Sie
androidboot.selinux=permissive
zuBOARD_KERNEL_CMDLINE
oder zuBOARD_BOOTCONFIG
in Android 12 mit Kernelversion 5.10 oder höher hinzufügen. Diese Variable ist inbuild/core/Makefile
schreibgeschützt, 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 Sie das Boot-Image und flashen Sie es. Das Gerät wird dann im permissiven Modus gebootet.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive