Strace cho phép bạn xem các lệnh gọi hệ thống mà một quy trình thực hiện và những gì các lệnh gọi hệ thống đó trả về.
Tạo strace
Để tạo strace, hãy chạy lệnh sau:
mmma -j6 external/strace
Đính kèm vào một quy trình đang chạy
Trường hợp sử dụng đơn giản và phổ biến nhất đối với strace là đính kèm quy trình này vào một quy trình đang chạy. Bạn có thể thực hiện việc này bằng cách:
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 tạo sau này.
Một quy trình thông thường tạo ra nhiều lệnh gọi hệ thống, vì vậy, bạn nên xem lại trang man của strace để 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 ứng dụng
Cách 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 có quyền truy cập thư mục gốc, tắt SELinux và khởi động lại thời gian chạy để xoá bộ lọc seccomp, nếu không, strace sẽ không chạy được:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- Thiết lập một thư mục mà mọi người có thể ghi cho nhật ký strace, vì strace sẽ chạy trong uid của ứng dụng:
adb shell mkdir -m 777 /data/local/tmp/strace
- Chọn quy trình cần theo dõi và chạy quy trình đó:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- Chạy quy trình như bình thường.
Sử dụng trên zygote
Để sử dụng strace trên zygote, hãy sửa dòng zygote init.rc
có liên quan (cần có 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 quá trình 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ếufile_context
SELinux 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. 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 của SELinux. Bạn có thể làm 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 hạt nhân phiên bản 5.10 trở lên. (Biến này trở thành chỉ có thể đọc trongbuild/core/Makefile
nhưng luôn có trong/device/*/BoardConfig
.)
Ví dụ cho thiết bị Pixel (sailfish) trong/device/google/marlin/sailfish/BoardConfig.mk
: Sau khi thực hiện thay đổi, hãy tạo và cài đặt ROM hình ảnh khởi động, thiết bị sẽ khởi động ở chế độ cho phép.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive