Sử dụng strace

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 cho strace là đính kèm nó 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 gắn 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 điển hình sẽ thực hiện nhiều lệnh gọi hệ thống, vì vậy bạn nên xem trang hướng dẫn 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:

  1. Thiết lập thiết bị để bạn có thể chạy strace. Bạn cần phải là người dùng root, vô hiệu hoá SELinux và khởi động lại thời gian chạy để xoá bộ lọc seccomp. Nếu không, bộ lọc này 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 toàn cầu 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
    
  3. 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"'
    
  4. Chạy quy trình này như bình thường.

Sử dụng trên hợp tử

Để sử dụng strace trên zygote, hãy sửa dòng zygote 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 quá trình khởi động Android

Để lấy 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. 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 có phiên bản nhân 5.10 trở lên. (Biến này sẽ trở thành chỉ đọc trong build/core/Makefile nhưng luôn có sẵn trong /device/*/BoardConfig.)

    Ví dụ về thiết bị Pixel (sailfish) 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à cài đặt ROM hình ảnh khởi động, thiết bị sẽ khởi động ở chế độ cho phép.