Strace ช่วยให้คุณเห็นการเรียกของระบบที่กระบวนการทำ และสิ่งที่การเรียกของระบบเหล่านั้นส่งคืน
สร้างร่องรอย
หากต้องการสร้าง strace ให้รันสิ่งต่อไปนี้:
mmma -j6 external/strace
แนบไปกับกระบวนการที่ทำงานอยู่
กรณีการใช้งานที่ง่ายและธรรมดาที่สุดสำหรับ strace คือการแนบมันเข้ากับกระบวนการที่กำลังทำงานอยู่ ซึ่งคุณสามารถทำได้ด้วย:
adb shell strace -f -p PID
แฟล็ก -f
บอกให้ strace แนบกับเธรดทั้งหมดในกระบวนการ รวมถึงเธรดใหม่ที่สร้างในภายหลัง
กระบวนการทั่วไปทำให้เกิดการเรียกใช้ระบบเป็นจำนวนมาก ดังนั้น คุณจะต้องตรวจสอบ strace man page เพื่อเรียนรู้วิธีรวบรวมเฉพาะข้อมูลที่คุณสนใจจริงๆ
การใช้งานบนแอพพลิเคชั่น
วิธีใช้ strace บนแอปพลิเคชัน:
- ตั้งค่าอุปกรณ์เพื่อให้คุณสามารถรัน strace ได้ คุณต้องรูท ปิดการใช้งาน SELinux และรีสตาร์ทรันไทม์เพื่อลบตัวกรอง seccomp ที่จะป้องกันไม่ให้ strace ทำงาน:
adb root
adb shell setenforce 0
adb shell stop
adb 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"'
- เปิดกระบวนการตามปกติ
ใช้กับไซโกต
หากต้องการใช้ 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
บริการที่กำหนดอาจไม่สามารถเริ่มต้นได้เนื่องจากไฟล์ 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 (ปลาเซลฟิช) ใน/device/google/marlin/sailfish/BoardConfig.mk
:- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
หลังจากทำการเปลี่ยนแปลง ให้สร้างและแฟลชอิมเมจสำหรับบูต และอุปกรณ์จะบู๊ตในโหมดอนุญาต