ใช้ Strace

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

สายงานบิลด์

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

mmma -j6 external/strace

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

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

adb shell strace -f -p PID

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

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

ใช้ในแอป

วิธีใช้ strace กับแอป

  1. ตั้งค่าอุปกรณ์เพื่อให้สามารถวิ่งได้ คุณต้องเป็นผู้ใช้ root, ปิดใช้ 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

หากต้องการดูบันทึก strace ระหว่างการบูต 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 (Sailfish) ใน /device/google/marlin/sailfish/BoardConfig.mk
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    หลังจากทําการเปลี่ยนแปลงแล้ว ให้สร้างและแฟลชอิมเมจการบูต แล้วอุปกรณ์จะบูตในโหมดอนุญาต