strace verwenden

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:

  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 sonst die Ausführung von strace verhindert:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. 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
    
  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 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 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 einen Kernel- oder bootconfig-Parameter hinzu und starten Sie dann das Gerät im SELinux-Moderationsmodus. Dazu fügen Sie androidboot.selinux=permissive zu BOARD_KERNEL_CMDLINE oder zu BOARD_BOOTCONFIG in Android 12 mit Kernelversion 5.10 oder höher hinzu. (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. Das Gerät wird dann im permissiven Modus gestartet.