Strace cho phép bạn xem các cuộc gọi hệ thống mà một quá trình thực hiện và những gì các cuộc gọi hệ thống đó trả về.
Tiến độ xây dựng
Để xây dựng strace, hãy chạy như sau:
mmma -j6 external/strace
Gắn vào một tiến trình đang chạy
Trường hợp sử dụng đơn giản và phổ biến nhất của strace là gắn nó vào một quy trình đang chạy, bạn có thể thực hiện việc này với:
adb shell strace -f -p PID
Cờ -f
yêu cầu strace đính kèm vào tất cả các luồng trong quy trình, cộng với mọi luồng mới được sinh ra sau đó.
Một quy trình điển hình thực hiện nhiều lệnh gọi hệ thống, vì vậy, bạn sẽ muốn xem lại trang strace man để tìm hiểu cách chỉ thu thập dữ liệu mà bạn thực sự quan tâm.
Sử dụng trên một ứng dụng
Để sử dụng strace trên một ứng dụng:
- Thiết lập thiết bị để bạn có thể chạy strace. Bạn cần phải root, vô hiệu hóa SELinux và khởi động lại thời gian chạy để loại bỏ bộ lọc seccomp vốn sẽ ngăn strace chạy:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Thiết lập một thư mục có thể ghi trên thế giới cho nhật ký strace, vì strace sẽ chạy dưới uid của ứng dụng:
adb shell mkdir -m 777 /data/local/tmp/strace
- Chọn quy trình để theo dõi và khởi chạy nó:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Khởi động quá trình bình thường.
Sử dụng trên hợp tử
Để sử dụng strace trên hợp tử, hãy sửa dòng hợp tử init.rc
có liên quan (yêu cầu 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
Nhận nhật ký strace trong khi khởi động Android
Để nhận nhật ký strace trong quá trình khởi động Android, hãy thực hiện các thay đổi sau:
- Vì tên quy trình thay đổi từ
zygote
thànhstrace
nên dịch vụ đã cho có thể không khởi động được do thiếu SELinuxfile_context
chostrace
. Giải pháp là thêm một dòng mới cho strace trongsystem/sepolicy/private/file_contexts
và sao chép ngữ cảnh tệp gốc sang. Ví dụ:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- Thêm tham số kernel hoặc bootconfig, sau đó khởi động thiết bị ở chế độ cho phép SELinux. Bạn có thể thực hiện việc này bằng cách thêm
androidboot.selinux=permissive
vàoBOARD_KERNEL_CMDLINE
hoặc vàoBOARD_BOOTCONFIG
trong Android 12 với kernel phiên bản 5.10 trở lên. (Biến này trở thành chỉ đọc trongbuild/core/Makefile
nhưng luôn có sẵn trong/device/*/BoardConfig
.)
Ví dụ cho thiết bị Pixel (cá cờ) trong/device/google/marlin/sailfish/BoardConfig.mk
:- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
Sau khi thực hiện thay đổi, hãy tạo và flash hình ảnh khởi động và thiết bị sẽ khởi động ở chế độ cho phép.