Strace使您能夠查看進程進行的系統調用以及這些系統調用返回的內容。
建設軌跡
要構建 strace,請運行以下命令:
mmma -j6 external/strace
附加到正在運行的進程
strace 最簡單和最常見的用例是將其附加到正在運行的進程,您可以這樣做:
adb shell strace -f -p PID
-f
標誌告訴 strace 附加到進程中的所有線程,以及以後產生的任何新線程。
一個典型的過程會進行大量系統調用,因此您需要查看strace 手冊頁以了解如何僅收集您真正感興趣的數據。
在應用程序上使用
在應用程序上使用 strace:
- 設置設備,以便您可以運行 strace。您需要成為 root,禁用 SELinux,然後重新啟動運行時以刪除 seccomp 過濾器,否則會阻止 strace 運行:
adb root
adb shell setenforce 0
adb shell stop
adb 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 上使用 strace,請修復相關的init.rc
行(需要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
或內核版本 5.10 或更高版本的 Android 12 中的BOARD_BOOTCONFIG
來執行此操作。 (此變量在build/core/Makefile
中變為只讀,但在/device/*/BoardConfig
下始終可用。)
/device/google/marlin/sailfish/BoardConfig.mk 中的 Pixel (/device/google/marlin/sailfish/BoardConfig.mk
) 設備示例:- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
進行更改後,構建並刷新啟動映像,設備將以許可模式啟動。