از strace استفاده کنید

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

ساخت مسیر

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

mmma -j6 external/strace

به یک فرآیند در حال اجرا متصل شوید

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

adb shell strace -f -p PID

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

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

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

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

  1. دستگاه را طوری تنظیم کنید که بتوانید strace را اجرا کنید. برای حذف فیلتر seccomp که در غیر این صورت از اجرای strace جلوگیری می‌کند، باید کاربر root باشید، SELinux را غیرفعال کنید و محیط اجرا را مجدداً راه‌اندازی کنید:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. یک دایرکتوری قابل نوشتن برای همه افراد در strace logs تنظیم کنید، زیرا 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 logs) در طول بوت اندروید، تغییرات زیر را اعمال کنید:

  • از آنجایی که نام فرآیند از zygote به strace تغییر می‌کند، ممکن است سرویس مورد نظر به دلیل فقدان file_context در SELinux برای strace شروع به کار نکند. راه حل این است که یک خط جدید برای strace در system/sepolicy/private/file_contexts اضافه کنید و context فایل اصلی را روی آن کپی کنید. مثال:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • پارامتر kernel یا bootconfig را اضافه کنید، سپس دستگاه را در حالت SELinux permissive بوت کنید. می‌توانید این کار را با اضافه کردن androidboot.selinux=permissive به BOARD_KERNEL_CMDLINE یا به BOARD_BOOTCONFIG در اندروید ۱۲ با نسخه کرنل ۵.۱۰ یا بالاتر انجام دهید. (این متغیر در 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
    
    پس از ایجاد تغییر، فایل بوت را بسازید و فلش کنید تا دستگاه در حالت مجاز بوت شود.