ใช้ strace

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

สร้าง strace

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

mmma -j6 external/strace

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

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

adb shell strace -f -p PID

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

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

ใช้ในแอป

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

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

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

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