使用Strace

Strace可讓您查看進程發出的系統呼叫以及這些系統呼叫所傳回的內容。

建構strace

若要建置 strace,請執行下列命令:

mmma -j6 external/strace

附加到正在運行的進程

strace 最簡單且最常見的用例是將其附加到正在運行的進程,您可以這樣做:

adb shell strace -f -p PID

-f標誌告訴 strace 附加到進程中的所有線程,以及稍後產生的任何新線程。

典型的過程會進行大量系統調用,因此您需要查看strace 手冊頁以了解如何僅收集您真正感興趣的資料。

在應用程式上使用

要在應用程式上使用 strace:

  1. 設定設備以便可以運行 strace。您需要成為 root 用戶,停用 SELinux,然後重新啟動運行時以刪除 seccomp 過濾器,否則該過濾器將阻止 strace 運行:
    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 上使用 strace,請修復相關的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 啟動期間取得 strace 日誌

若要在 Android 啟動期間取得 strace 日誌,請進行下列變更:

  • 由於進程名稱從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新增至BOARD_KERNEL_CMDLINE或核心版本 5.10 或更高版本的 Android 12 中的BOARD_BOOTCONFIG來實現此目的。 (此變數在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
    
    進行更改後,建置並刷新啟動映像,裝置將以寬容模式啟動。