Strace ช่วยให้คุณเห็นการเรียกระบบที่กระบวนการทำและผลลัพธ์ของการเรียกระบบเหล่านั้น
สายงานบิลด์
หากต้องการสร้าง strace ให้เรียกใช้คำสั่งต่อไปนี้
mmma -j6 external/strace
แนบกับกระบวนการที่ทำงานอยู่
กรณีการใช้งานที่ง่ายและพบบ่อยที่สุดสำหรับ strace คือการเชื่อมต่อกับกระบวนการที่ทำงานอยู่ ซึ่งคุณทําได้ด้วยวิธีต่อไปนี้
adb shell strace -f -p PID
แฟล็ก -f
จะบอกให้ strace แนบไปกับเธรดทั้งหมดในกระบวนการ รวมถึงเธรดใหม่ที่สร้างขึ้นในภายหลัง
กระบวนการทั่วไปจะเรียกใช้ระบบจำนวนมาก คุณจึงควรอ่านหน้าแมนของ strace เพื่อดูวิธีรวบรวมเฉพาะข้อมูลที่สนใจจริงๆ
ใช้ในแอป
วิธีใช้ strace กับแอป
- ตั้งค่าอุปกรณ์เพื่อให้สามารถวิ่งได้ คุณต้องเป็นผู้ใช้ root, ปิดใช้ SELinux และรีสตาร์ทรันไทม์เพื่อนำตัวกรอง seccomp ออก ซึ่งจะป้องกันไม่ให้ strace ทำงาน
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- ตั้งค่าไดเรกทอรีที่สามารถเขียนข้อมูลได้ทั่วโลกสำหรับบันทึกการติดตาม เนื่องจาก Strace จะทำงานภายใต้ UID ของแอป:
adb shell mkdir -m 777 /data/local/tmp/strace
- เลือกกระบวนการที่จะติดตามและเปิดใช้
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- เรียกใช้กระบวนการตามปกติ
ใช้กับไซโก้ต์
หากต้องการใช้ strace ใน zygote ให้แก้ไขinit.rc
บรรทัด zygote ที่เกี่ยวข้อง (ต้องมี 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
ดูบันทึก strace ระหว่างการบูต Android
หากต้องการดูบันทึก strace ระหว่างการบูต Android ให้ทำการเปลี่ยนแปลงต่อไปนี้
- เนื่องจากชื่อกระบวนการเปลี่ยนจาก
zygote
เป็นstrace
บริการที่ระบุอาจเริ่มต้นไม่สำเร็จเนื่องจากไม่มี SELinuxfile_context
สำหรับstrace
วิธีแก้ปัญหาคือ ให้เพิ่มบรรทัดใหม่สำหรับ strace ในsystem/sepolicy/private/file_contexts
และคัดลอกบริบทไฟล์ต้นฉบับมาวาง ตัวอย่าง/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- เพิ่มพารามิเตอร์เคอร์เนลหรือ bootconfig แล้วบูตอุปกรณ์ในโหมด SELinux แบบอนุญาต ซึ่งทำได้โดยการเพิ่ม
androidboot.selinux=permissive
ไปยังBOARD_KERNEL_CMDLINE
หรือไปยังBOARD_BOOTCONFIG
ใน Android 12 ที่มีเคอร์เนลเวอร์ชัน 5.10 ขึ้นไป (ตัวแปรนี้จะเป็นแบบอ่านอย่างเดียวในbuild/core/Makefile
แต่จะใช้ได้เสมอใน/device/*/BoardConfig
)
ตัวอย่างสำหรับอุปกรณ์ Pixel (Sailfish) ใน/device/google/marlin/sailfish/BoardConfig.mk
หลังจากทําการเปลี่ยนแปลงแล้ว ให้สร้างและแฟลชอิมเมจการบูต แล้วอุปกรณ์จะบูตในโหมดอนุญาต- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive