با استفاده از Strace

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

مسیر ساختمان

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

mmma -j6 external/strace

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

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

adb shell strace -f -p PID

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

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

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

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

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

استفاده در زیگوت

برای استفاده از استریس روی زیگوت، خط زیگوت مربوطه 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 log در هنگام بوت اندروید

برای دریافت strace log در هنگام بوت اندروید، تغییرات زیر را اعمال کنید:

  • از آنجایی که نام فرآیند از 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 (sailfish) در /device/google/marlin/sailfish/BoardConfig.mk :
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    پس از انجام تغییر، تصویر بوت را بسازید و فلش کنید و دستگاه در حالت مجاز بوت می شود.