استفاده از strace

Strace به شما امکان می‌دهد تماس‌های سیستمی را که یک فرایند برقرار می‌کند و آنچه این تماس‌های سیستمی برمی‌گردانند را ببینید.

ساختن strace

برای ساختن strace، دستور زیر را اجرا کنید:

mmma -j6 external/strace

پیوست کردن به فرایند درحال اجرا

ساده‌ترین و رایج‌ترین مورد استفاده برای strace این است که آن را به یک فرایند درحال اجرا متصل کنید، که می‌توانید با این کار انجام دهید:

adb shell strace -f -p PID

پرچم -f به strace می‌گوید که به همه رشته‌های موجود در فرایند، به‌علاوه هر رشته جدیدی که بعداً ایجاد می‌شود، متصل شود.

فرایند معمولی تماس‌های سیستمی زیادی برقرار می‌کند، بنابراین بهتر است صفحه راهنمای strace را بررسی کنید تا یاد بگیرید چگونه فقط داده‌هایی را که واقعاً به آن‌ها علاقه‌مندید جمع‌آوری کنید.

استفاده در برنامه

برای استفاده از strace در برنامه:

  1. دستگاه را طوری راه‌اندازی کنید که بتوانید strace را اجرا کنید. برای برداشتن فیلتر seccomp که درغیراین‌صورت مانع اجرای strace می‌شود، باید کاربر ریشه باشید، SELinux را غیرفعال کنید، و زمان اجرا را بازراه‌اندازی کنید:
    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 با نسخه هسته ۵.۱۰ یا بالاتر انجام دهید. (این متغیر در 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
    
    پس‌از اعمال تغییر، تصویر راه‌اندازی را بسازید و آن را در حافظه فلش دستگاه قرار دهید تا دستگاه در حالت مجاز راه‌اندازی شود.