การใช้สเตรซ

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

สร้างร่องรอย

หากต้องการสร้าง strace ให้รันสิ่งต่อไปนี้:

mmma -j6 external/strace

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

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

adb shell strace -f -p PID

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

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

การใช้งานบนแอพพลิเคชั่น

วิธีใช้ 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. เปิดกระบวนการตามปกติ

ใช้กับไซโกต

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