Kể từ ngày 27 tháng 3 năm 2025, bạn nên sử dụng android-latest-release
thay vì aosp-main
để xây dựng và đóng góp cho AOSP. Để biết thêm thông tin, hãy xem phần Thay đổi đối với AOSP.
Sử dụng strace
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
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 công cụ 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:
adb shell strace -f -p PID
Cờ -f
yêu cầu strace đính kèm vào tất cả luồng trong quá trình, cùng với mọi luồng mới được tạo sau đó.
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 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 khắc phục dòng zygote init.rc
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 file_context
SELinux 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 của SELinux. Bạn có thể làm 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 hạt nhân phiên bản 5.10 trở lên.
(Biến này trở thành chỉ có thể đọc trong build/core/Makefile
nhưng luôn có sẵn trong /device/*/BoardConfig
.)
Ví dụ cho 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.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Use strace\n\n[Strace](https://strace.io) enables you to see the system calls a\nprocess makes and what those system calls return.\n\nBuild strace\n------------\n\nTo build strace, run the following: \n\n```\nmmma -j6 external/strace\n```\n\nAttach to a running process\n---------------------------\n\nThe simplest and most common use case for strace is to attach it to a running\nprocess, which you can do with: \n\n```\nadb shell strace -f -p PID\n```\n\nThe `-f` flag tells strace to attach to all the threads in the\nprocess, plus any new threads spawned later.\n\nA typical process makes a lot of system calls, so you'll want to review the\n[strace man page](http://man7.org/linux/man-pages/man1/strace.1.html)\nto learn how to collect only data you're actually interested in.\n\nUse on an app\n-------------\n\nTo use strace on an app:\n\n1. Set up the device so that you can run strace. You need to be root, disable SELinux, and restart the runtime to remove the seccomp filter that will otherwise prevent strace from running: \n\n adb root\n adb shell setenforce 0\n adb shell stop\n adb shell start\n\n2. Set up a world-writable directory for strace logs, because strace will be running under the app's uid: \n\n adb shell mkdir -m 777 /data/local/tmp/strace\n\n3. Choose the process to trace and launch it: \n\n ```\n adb shell setprop wrap.com.android.calendar '\"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt\"'\n ```\n4. Launch the process normally.\n\nUse on the zygote\n-----------------\n\nTo use strace on the zygote, fix the relevant `init.rc` zygote\nline (requires `adb shell setenforce 0`): \n\n cd system/core/\n patch -p1 \u003c\u003cEOF\n --- a/rootdir/init.zygote32.rc\n +++ b/rootdir/init.zygote32.rc\n @@ -1,4 +1,4 @@\n -service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server\n +service zygote /system/bin/strace -o /data/local/tmp/zygote.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server\n class main\n socket zygote stream 660 root system\n onrestart write /sys/android_power/request_state wake\n EOF\n\nGet strace logs during Android boot\n-----------------------------------\n\nTo get strace logs during Android boot, make the following changes:\n\n- Since the process name changes from `zygote` to `strace`, the given service may fail to start due to the missing SELinux `file_context` for `strace`. The solution is to add a new line for strace in `system/sepolicy/private/file_contexts` and copy the original file context over. Example: \n\n ```\n /dev/socket/zygote u:object_r:zygote_socket:s0\n + /system/bin/strace u:object_r:zygote_socket:s0\n ```\n- Add kernel or bootconfig parameter, then boot the device in SELinux permissive mode. You can do this by adding `androidboot.selinux=permissive`to `BOARD_KERNEL_CMDLINE`, or to `BOARD_BOOTCONFIG` in Android 12 with kernel version 5.10 or greater. (This variable becomes read-only in `build/core/Makefile` but is always available under `/device/*/BoardConfig`.) \n\n Example for the Pixel (sailfish) device in `/device/google/marlin/sailfish/BoardConfig.mk`: \n\n ```\n - BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ...\n +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive\n ```\n After making the change, build and flash the boot image and the device will boot in permissive mode."]]