ใช้ strace

Strace ช่วยให้คุณเห็นการเรียกระบบที่กระบวนการทำและผลลัพธ์ของการเรียกระบบเหล่านั้น

สายงานบิลด์

หากต้องการสร้าง strace ให้เรียกใช้คำสั่งต่อไปนี้

mmma -j6 external/strace

แนบกับกระบวนการที่ทำงานอยู่

กรณีการใช้งานที่ง่ายและพบบ่อยที่สุดสำหรับ strace คือการเชื่อมต่อกับกระบวนการที่ทำงานอยู่ ซึ่งคุณทำได้ด้วยวิธีต่อไปนี้

adb shell strace -f -p PID

แฟล็ก -f จะบอกให้ strace แนบไปกับเธรดทั้งหมดในกระบวนการ รวมถึงเธรดใหม่ที่เกิดขึ้นในภายหลัง

กระบวนการทั่วไปเรียกใช้ระบบจำนวนมาก คุณจึงต้องตรวจสอบ หน้าสแตรซแมน เพื่อดูวิธีเก็บเฉพาะข้อมูลที่คุณสนใจจริงๆ

ใช้ในแอป

วิธีใช้ Strace ในแอป

  1. ตั้งค่าอุปกรณ์เพื่อให้เรียกใช้ strace ได้ คุณต้องรูท ปิดใช้ SELinux และรีสตาร์ท รันไทม์เพื่อนำตัวกรอง seccomp ออก มิฉะนั้นจะทำให้ใช้ Strace ไม่ได้
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. ตั้งค่าไดเรกทอรีที่สามารถเขียนข้อมูลได้ทั่วโลกสำหรับบันทึกเส้นทาง เนื่องจาก strace จะทำงานอยู่ภายใต้ uid ของแอป:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. เลือกกระบวนการที่จะติดตามและเปิดใช้
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. เรียกใช้กระบวนการตามปกติ

ใช้กับไซโกต์

หากต้องการใช้ 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 บริการที่ระบุอาจเริ่มต้นไม่สำเร็จเนื่องจากไม่มี SELinux file_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
    
    หลังจากเปลี่ยนแปลงแล้ว ให้สร้างและแฟลชอิมเมจการเปิดเครื่องแล้วอุปกรณ์จะเปิดเครื่อง ในโหมดไม่เข้มงวด