Strace ช่วยให้คุณเห็นการเรียกใช้ระบบที่กระบวนการทำและสิ่งที่การเรียกใช้ระบบเหล่านั้นส่งคืน
สร้าง strace
หากต้องการสร้าง strace ให้เรียกใช้คำสั่งต่อไปนี้
mmma -j6 external/strace
แนบกับกระบวนการที่กำลังทำงาน
Use Case ที่ง่ายที่สุดและพบบ่อยที่สุดสำหรับ strace คือการแนบเข้ากับกระบวนการที่กำลังทำงาน ซึ่งคุณทำได้โดยใช้คำสั่งต่อไปนี้
adb shell strace -f -p PID
แฟล็ก -f จะบอกให้ strace แนบไปกับเธรดทั้งหมดในกระบวนการ
รวมถึงเธรดใหม่ที่สร้างขึ้นในภายหลัง
กระบวนการทั่วไปจะเรียกใช้ระบบหลายครั้ง ดังนั้นคุณควรตรวจสอบหน้าคู่มือ strace เพื่อดูวิธีรวบรวมเฉพาะข้อมูลที่คุณสนใจจริงๆ
ใช้ในแอป
วิธีใช้ strace ในแอป
- ตั้งค่าอุปกรณ์เพื่อให้คุณเรียกใช้ strace ได้ คุณต้องเป็นรูท ปิดใช้ SELinux และรีสตาร์ท
รันไทม์เพื่อนำตัวกรอง seccomp ออก ซึ่งมิฉะนั้นจะป้องกันไม่ให้ strace ทำงาน
adb rootadb shell setenforce 0adb shell stopadb shell start - ตั้งค่าไดเรกทอรีที่เขียนได้ทั่วโลกสำหรับบันทึก strace เนื่องจาก strace จะทำงานภายใต้ uid ของแอป
adb shell mkdir -m 777 /data/local/tmp/strace - เลือกกระบวนการที่จะติดตามและเปิดใช้
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- เปิดกระบวนการตามปกติ
ใช้ใน 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บริการที่ระบุจึงอาจเริ่มต้นไม่สำเร็จเนื่องจากไม่มี SELinuxfile_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