strace verwenden

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:

  1. 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
    
  2. 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
    
  3. 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"'
    
  4. 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 zu strace enthält, wird der angegebene Dienst möglicherweise aufgrund der fehlenden SELinux file_context für strace. Die Lösung besteht darin, Fügen Sie in system/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=permissivezu BOARD_KERNEL_CMDLINE oder unter Android auf BOARD_BOOTCONFIG 12 mit Kernel-Version 5.10 oder höher. (Diese Variable wird in build/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.