strace verwenden

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:

  1. 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
    
  2. 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
    
  3. 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"'
    
  4. 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 in strace ändert, kann der Dienst aufgrund des fehlenden SELinux-file_context für strace nicht gestartet werden. Die Lösung besteht darin, in system/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 zu BOARD_KERNEL_CMDLINE oder zu BOARD_BOOTCONFIG in Android 12 mit der Kernelversion 5.10 oder höher hinzu. Diese Variable ist in build/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:
    - 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. Das Gerät wird dann im permissiven Modus gestartet.