Mit Strace sehen Sie, wie das System eine und was diese Systemaufrufe zurückgeben.
Build-Strace
Führen Sie folgenden Befehl aus, um strace zu erstellen:
mmma -j6 external/strace
An einen laufenden Prozess anhängen
Der einfachste und häufigste Anwendungsfall für strace besteht darin, es an eine laufende Sie haben folgende Möglichkeiten:
adb shell strace -f -p PID
Das Flag -f
weist strace an, an alle Threads im
und neue Threads, die später erzeugt werden.
Ein typischer Prozess führt viele Systemaufrufe aus. Strace-Manpage wie Sie nur Daten sammeln, die Sie tatsächlich interessieren.
In einer App verwenden
So verwenden Sie strace in einer Anwendung:
- Richten Sie das Gerät so ein, dass Sie strace ausführen können. Sie müssen Root sein, SELinux deaktivieren und neu starten.
die Laufzeit, 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 für strace-Logs ein Verzeichnis ein, das von allen Nutzern geschrieben werden kann, da strace unter der
App-UID:
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.
Für Zygote verwenden
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-Logs 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
zustrace
enthält, wird der angegebene Dienst möglicherweise aufgrund der fehlenden SELinuxfile_context
fürstrace
. Die Lösung besteht darin, Fügen Sie insystem/sepolicy/private/file_contexts
eine neue Zeile für strace hinzu und kopieren Sie den Kontext der Originaldatei. 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 dann im SELinux-Moderationsmodus. Sie können
fügen Sie dazu
androidboot.selinux=permissive
zuBOARD_KERNEL_CMDLINE
oder unter Android aufBOARD_BOOTCONFIG
12 mit Kernel-Version 5.10 oder höher. (Diese Variable wird inbuild/core/Makefile
schreibgeschützt, ist aber immer verfügbar unter/device/*/BoardConfig
.)
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 du die Änderung vorgenommen hast, kannst du das Boot-Image erstellen und flashen. Das Gerät startet dann. im moderaten Modus.