Strace 可讓您查看程序發出的系統呼叫,以及這些系統呼叫傳回的內容。
建構 strace
如要建構 strace,請執行下列指令:
mmma -j6 external/strace
附加至執行中的程序
strace 最簡單且最常見的用途是將其附加至執行中的程序,方法如下:
adb shell strace -f -p PID
-f 旗標會告知 strace 附加至程序中的所有執行緒,以及稍後產生的任何新執行緒。
一般程序會發出許多系統呼叫,因此建議您查看 strace man 頁面,瞭解如何只收集您實際感興趣的資料。
在應用程式中使用
如要在應用程式上使用 strace:
- 設定裝置,以便執行 strace。您必須是根使用者、停用 SELinux,並重新啟動執行階段,才能移除 seccomp 篩選器,否則 strace 無法執行:
adb rootadb shell setenforce 0adb shell stopadb shell start - 為 strace 記錄檔設定可供全域寫入的目錄,因為 strace 會在應用程式的 uid 下執行:
adb shell mkdir -m 777 /data/local/tmp/strace - 選擇要追蹤的程序並啟動:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- 照常啟動程序。
在 Zygote 上使用
如要在 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的 SELinuxfile_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,或在 Android 12 中新增至BOARD_BOOTCONFIG(核心版本須為 5.10 以上)。(這個變數在build/core/Makefile中會變成唯讀,但一律可在/device/*/BoardConfig下使用。)
Pixel (sailfish) 裝置在/device/google/marlin/sailfish/BoardConfig.mk中的範例: 變更完成後,請建構並刷新啟動映像檔,裝置就會以寬鬆模式啟動。- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive