使用 strace

Strace 可讓您查看系統呼叫 以及這些系統呼叫傳回的內容

建構 strace

如要建構追蹤記錄,請執行下列指令:

mmma -j6 external/strace

附加至執行中的程序

strace 最簡單且最常見的用途,就是將其附加至執行中的程序,您可以透過以下方式執行這項操作:

adb shell strace -f -p PID

-f 標記會指示 strace 附加至程序中的所有執行緒,以及之後產生的任何新執行緒。

一般程序會產生許多系統呼叫,因此建議您參閱 strace 說明頁面,瞭解如何只收集您實際感興趣的資料。

在應用程式中使用

如要在應用程式中使用 strace,請按照下列步驟操作:

  1. 設定裝置,以便執行 strace。您必須具備 Root 權限、停用 SELinux,然後重新啟動 執行這個回呼,移除 seccomp 篩選器以移除會造成追蹤記錄無法執行的 seccomp 篩選器:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. 請為 strace 記錄檔設定可供所有使用者寫入的目錄,因為 strace 會在應用程式的 uid 下執行:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. 選擇要追蹤的程序並啟動:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. 照常啟動程序。

在 zygote 上使用

如要在 zygote 上使用追蹤記錄,請修正相關的 init.rc zygote 行 (需要 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

在 Android 啟動期間取得追蹤記錄

如要在 Android 啟動期間取得追蹤記錄記錄,請進行下列變更:

  • 由於程序名稱已從 zygote 變更為 strace,因此系統可能會因 strace 缺少 SELinux file_context 而無法啟動指定服務。解決方法是在 system/sepolicy/private/file_contexts 中為 strace 新增一行,然後複製原始檔案內容。範例如下:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • 新增核心或 bootconfig 參數,並以 SELinux 許可模式啟動裝置。你可以 方法是將 androidboot.selinux=permissive 新增至 在 Android 中設為 BOARD_KERNEL_CMDLINE 或到 BOARD_BOOTCONFIG 12 和核心版本 5.10 以上的版本。 (這個變數在 build/core/Makefile 中會變成唯讀,但在 /device/*/BoardConfig 下始終可用)。

    /device/google/marlin/sailfish/BoardConfig.mk 中 Pixel (sailfish) 裝置的範例:
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    變更完成後,請建構並刷新啟動映像檔,裝置就會以開放模式啟動。