Strace verwenden

Mit Strace können Sie sehen, welche Systemaufrufe ein Prozess ausführt und was diese Systemaufrufe zurückgeben.

Gebäudestraße

Um Strace zu erstellen, führen Sie Folgendes aus:

mmma -j6 external/strace

Anhängen an einen laufenden Prozess

Der einfachste und häufigste Anwendungsfall für Strace besteht darin, es an einen laufenden Prozess anzuhängen, was Sie wie folgt tun können:

adb shell strace -f -p PID

Das Flag -f weist Strace an, sich an alle Threads im Prozess sowie an alle später erzeugten neuen Threads anzuhängen.

Ein typischer Prozess führt viele Systemaufrufe aus, daher sollten Sie die Strace-Manpage lesen, um zu erfahren, wie Sie nur die Daten sammeln, die Sie tatsächlich interessieren.

Verwendung in einer Anwendung

So verwenden Sie Strace für eine Anwendung:

  1. 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
    
  2. Richten Sie ein weltweit 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
    
  3. 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"'
    
  4. Starten Sie den Vorgang normal.

Verwendung auf der Zygote

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-Protokolle während des Android-Starts abrufen

Um Strace-Protokolle während des Android-Starts abzurufen, nehmen Sie die folgenden Änderungen vor:

  • Da sich der Prozessname von zygote in strace ändert, kann es sein, dass der angegebene Dienst aufgrund des fehlenden SELinux- file_context für strace nicht gestartet werden kann. Die Lösung besteht darin, eine neue Zeile für strace in system/sepolicy/private/file_contexts 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 permissiven SELinux-Modus. Sie können dies tun, indem Sie androidboot.selinux=permissive zu BOARD_KERNEL_CMDLINE oder zu BOARD_BOOTCONFIG in Android 12 mit Kernel-Version 5.10 oder höher hinzufügen. (Diese Variable wird in build/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 :
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Nachdem Sie die Änderung vorgenommen haben, erstellen und flashen Sie das Boot-Image und das Gerät startet im permissiven Modus.