Strace ช่วยให้คุณเห็นการเรียกระบบที่กระบวนการทำและผลลัพธ์ของการเรียกระบบเหล่านั้น
สร้าง strace
หากต้องการสร้าง strace ให้เรียกใช้คำสั่งต่อไปนี้
mmma -j6 external/strace
แนบกับกระบวนการที่ทำงานอยู่
Use Case ที่ง่ายที่สุดและพบบ่อยที่สุดสำหรับ strace คือการแนบไปกับกระบวนการที่ทำงานอยู่ ซึ่งคุณทําได้ด้วยวิธีต่อไปนี้
adb shell strace -f -p PID
แฟล็ก -f
จะบอกให้ strace แนบไปกับเธรดทั้งหมดในกระบวนการ รวมถึงเธรดใหม่ที่เกิดขึ้นในภายหลัง
กระบวนการทั่วไปจะเรียกใช้ระบบจำนวนมาก คุณจึงควรอ่านหน้าแมนของ strace เพื่อดูวิธีรวบรวมเฉพาะข้อมูลที่สนใจ
ใช้ในแอป
วิธีใช้ strace กับแอป
- ตั้งค่าอุปกรณ์เพื่อให้เรียกใช้ strace ได้ คุณต้องเป็นผู้ใช้ root, ปิดใช้ SELinux และรีสตาร์ทรันไทม์เพื่อนำตัวกรอง seccomp ออก ซึ่งจะป้องกันไม่ให้ strace ทำงาน
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- ตั้งค่าไดเรกทอรีที่ผู้ใช้ทุกคนเขียนได้สำหรับบันทึก strace เนื่องจาก 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