Strace ช่วยให้คุณเห็นการเรียกระบบที่กระบวนการทำและผลลัพธ์ของการเรียกระบบเหล่านั้น
สายงานบิลด์
หากต้องการสร้าง strace ให้เรียกใช้คำสั่งต่อไปนี้
mmma -j6 external/strace
แนบกับกระบวนการที่ทำงานอยู่
กรณีการใช้งานที่ง่ายและพบบ่อยที่สุดสำหรับ strace คือการเชื่อมต่อกับกระบวนการที่ทำงานอยู่ ซึ่งคุณทำได้ด้วยวิธีต่อไปนี้
adb shell strace -f -p PID
แฟล็ก -f
จะบอกให้ strace แนบไปกับเธรดทั้งหมดในกระบวนการ รวมถึงเธรดใหม่ที่เกิดขึ้นในภายหลัง
กระบวนการทั่วไปเรียกใช้ระบบจำนวนมาก คุณจึงต้องตรวจสอบ หน้าสแตรซแมน เพื่อดูวิธีเก็บเฉพาะข้อมูลที่คุณสนใจจริงๆ
ใช้ในแอป
วิธีใช้ Strace ในแอป
- ตั้งค่าอุปกรณ์เพื่อให้เรียกใช้ strace ได้ คุณต้องรูท ปิดใช้ 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
หากต้องการรับบันทึกเส้นทางขณะเปิดเครื่อง 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 (ปลากระโทงร่ม) ใน/device/google/marlin/sailfish/BoardConfig.mk
: หลังจากเปลี่ยนแปลงแล้ว ให้สร้างและแฟลชอิมเมจการเปิดเครื่องแล้วอุปกรณ์จะเปิดเครื่อง ในโหมดไม่เข้มงวด- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive