Sử dụng Strace

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:

  1. 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
    
  2. 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
    
  3. 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"'
    
  4. 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ành strace nên dịch vụ đã cho có thể không khởi động được do thiếu SELinux file_context cho strace . Giải pháp là thêm một dòng mới cho strace trong system/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ào BOARD_KERNEL_CMDLINE hoặc vào BOARD_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 trong build/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.