ใช้ strace

Strace ช่วยให้คุณเห็นการเรียกใช้ระบบที่กระบวนการทำและสิ่งที่การเรียกใช้ระบบเหล่านั้นส่งคืน

สร้าง strace

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

mmma -j6 external/strace

แนบกับกระบวนการที่กำลังทำงาน

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

adb shell strace -f -p PID

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

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

ใช้ในแอป

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

  1. ตั้งค่าอุปกรณ์เพื่อให้คุณเรียกใช้ strace ได้ คุณต้องเป็นรูท ปิดใช้ SELinux และรีสตาร์ท รันไทม์เพื่อนำตัวกรอง seccomp ออก ซึ่งมิฉะนั้นจะป้องกันไม่ให้ strace ทำงาน
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. ตั้งค่าไดเรกทอรีที่เขียนได้ทั่วโลกสำหรับบันทึก strace เนื่องจาก 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. เปิดกระบวนการตามปกติ

ใช้ใน Zygote

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