اشکال زدایی SDV

این راهنما مروری بر ابزارها و تکنیک‌های ضروری برای اشکال‌زدایی سرویس‌ها و برنامه‌هایی که بر روی پلتفرم SDV اجرا می‌شوند، ارائه می‌دهد.

به دستگاه وصل شوید

ابزار اصلی برای اتصال و تعامل با دستگاه، Android Debug Bridge (adb) است. تأیید کنید که adb در مسیر سیستم شما قرار دارد.

اتصال با استفاده از شبکه

اگر دستگاه در همان شبکه است و شما آدرس IP آن را می‌دانید، می‌توانید از طریق اترنت متصل شوید. سیستم ما منحصراً از اتصالات شبکه برای adb استفاده می‌کند:

# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555

اتصال به چندین دستگاه

برای مدیریت چندین دستگاه از یک ایستگاه کاری واحد، می‌توانید از طریق آدرس‌های IP مختلف به آنها متصل شوید. اگر چندین ماشین مجازی را روی یک میزبان واحد اجرا می‌کنید، باید پورت‌های مختلفی را به هر دستگاه اختصاص دهید. این امر مستلزم پیکربندی سرویس adb در هر دستگاه SDV برای گوش دادن به یک پورت منحصر به فرد است، به عنوان مثال، ۵۵۵۵ برای دستگاه اول و ۵۵۵۶ برای دستگاه دوم. همچنین می‌توانید میزبان را طوری پیکربندی کنید که آن پورت‌ها را به مهمان‌های مختلف ارسال کند:

# Connect to the first device
adb connect <device_1_ip_address>:5555

# Connect to a second device
adb connect <device_2_ip_address>:5555

# Connect to a second VM on first device on different port
adb connect <device_1_ip_address>:5556

# List all connected devices to verify
adb devices

وقتی دستورات بعدی adb را اجرا می‌کنید، می‌توانید با استفاده از پرچم -s به همراه آدرس کامل آن ( ip:port ) یک دستگاه خاص را هدف قرار دهید:

# Run a shell command on the second VM on first device in the above example
adb -s <device_1_ip_address>:5556 shell

مشاهده گزارش‌ها

وقتی یک سرویس از کار می‌افتد یا رفتار غیرمنتظره‌ای دارد، ابتدا لاگ‌ها را بررسی کنید.

از logcat (گزارش‌های اندروید) استفاده کنید

logcat گزارش‌های مربوط به سرویس‌های سیستم، agentها و بسته‌های سرویس را نمایش می‌دهد:

# View all logs in real-time
adb logcat

# Filter logs by a specific tag (e.g., the name of your service)
adb logcat -s MyServiceTag

# Filter logs by priority (V: Verbose, D: Debug, I: Info, W: Warn, E: Error, F: Fatal)
# This shows only Error and Fatal messages for a specific tag
adb logcat MyServiceTag:E *:S

# Clear old logs before viewing new ones
adb logcat -c && adb logcat

# Show all logs and return
adb logcat -d

# Color logs by level
adb logcat -v color

# Show timestamps as time since boot
adb logcat -v monotonic

استفاده از dmesg (لاگ‌های هسته)

dmesg گزارش‌های هسته لینوکس را نمایش می‌دهد. این برای اشکال‌زدایی موارد زیر بسیار مهم است:

  • مشکلات سخت‌افزاری و درایورها
  • وحشت هسته
  • انکارهای SELinux ( avc: denied ) - همچنین در logcat نمایش داده می‌شود
# View all kernel messages
adb shell dmesg

# Follow kernel messages in real-time
adb shell dmesg -w

لاگ‌های دسترسی در Cuttlefish

وقتی Cuttlefish را روی یک دستگاه مجازی اجرا می‌کنید، می‌توانید مستقیماً از سیستم فایل دستگاه میزبان به فایل‌های گزارش دسترسی پیدا کنید. این امر به ویژه در صورت عدم دسترسی به adb مفید است. وقتی Cuttlefish را اجرا می‌کنید، تمام مسیرهای اشکال‌زدایی را نمایش می‌دهد و همچنین می‌توانید با استفاده از cvd fleet برای همه نمونه‌های در حال اجرا، آنها را جستجو کنید.

  • Logcat (گزارش‌های اندروید): cuttlefish/instances/cvd-1/logs/logcat
  • لاگ‌های هسته: cuttlefish/instances/cvd-1/logs/kernel.log
  • لاگ‌های لانچر Cuttlefish: cuttlefish/instances/cvd-1/logs/launcher.log (برای اشکال‌زدایی خود محیط Cuttlefish مفید است)

شما می‌توانید از ابزارهای استاندارد خط فرمان مانند cat ، less یا tail -f برای مشاهده این فایل‌ها به صورت بلادرنگ استفاده کنید.

تعامل با پوسته و سیستم فایل

دسترسی shell را برای اجرای مستقیم دستورات روی دستگاه، بررسی وضعیت فرآیند و پیمایش سیستم فایل به دست آورید:

# Open an interactive shell on the device
adb shell

# From within the shell, you can check running processes
ps -A

# Or check the status of a specific service managed by init
getprop init.svc.<service_name>

انجام عملیات سیستم فایل

از adb push و adb pull برای انتقال فایل‌ها بین دستگاه میزبان و دستگاه خود استفاده کنید. از این دستورات برای استقرار اسکریپت‌های آزمایشی، به‌روزرسانی پیکربندی یا بازیابی فایل‌های خرابی استفاده کنید:

# Push a file from your computer to the device
adb push my_local_file.txt /data/local/tmp/

# Pull a file from the device to your computer
adb pull /data/tombstones/tombstone_00 .

اشکال‌زدایی برنامه‌ها (C++/Rust)

شما می‌توانید برنامه‌ها را به صورت آنلاین یا آفلاین اشکال‌زدایی کنید.

استفاده از lldb برای اشکال‌زدایی زنده

lldb دیباگر پیش‌فرض در اندروید استودیو است و اغلب برای توسعه مدرن C++ و Rust ترجیح داده می‌شود.

این مراحل راه‌اندازی را دنبال کنید:

  1. adb را مجدداً راه‌اندازی کنید تا مجوزهای ریشه (برای ارسال) فعال شود. از این برای تنظیم ارسال پورت استفاده کنید. در میزبان، دستور زیر را اجرا کنید:

    adb root
    
  2. اگر یک فایل باینری دارای نمادهای اشکال‌زدایی است، یک نسخه بدون علامت‌گذاری را وارد کنید. می‌توانید نسخه بدون علامت‌گذاری را در out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE] پیدا کنید. به عنوان مثال، برای آپلود rpcagent از system_ext و sdv_core_cf ، دستور زیر را اجرا کنید:

    adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmp
    

    اکنون نسخه حذف نشده در /data/local/tmp قرار دارد.

  3. با استفاده از اسکریپت lldbclient.py به کلاینت LLDB متصل شوید:

    # Run and connect a binary on device, run on host:
    lldbclient.py -r /data/local/tmp/rpcagent
    
    # Connect to an existing process with PID 2759
    lldbclient.py -p 2759
    

    این اسکریپت lldb را از راه دور متصل می‌کند. برای مشاهده‌ی تمام پرچم‌های موجود، lldbclient.py را اجرا کنید. برای اتصال آن به lldb به مستندات IDE خود مراجعه کنید.

تجزیه و تحلیل محل‌های دفن زباله (سنگ قبرها)

وقتی یک سرویس از کار می‌افتد، یک فایل tombstone در مسیر /data/tombstones/ ایجاد می‌شود. این فایل شامل ردگیری پشته، نقشه حافظه و سایر اطلاعات حیاتی است.

فایل سنگ قبر را بیرون بکشید، سپس از یک ابزار آگاه از نماد (مانند lldb یا یک اسکریپت اختصاصی) برای تجزیه و تحلیل آن با نسخه بدون حذف فایل باینری استفاده کنید.

عملکرد را تجزیه و تحلیل کنید

SDV از ابزارهای متعددی برای اندازه‌گیری عملکرد پشتیبانی می‌کند.

بررسی میزان استفاده از پردازنده و حافظه

  • top : نمای لحظه‌ای از فرآیندهای در حال اجرا را که بر اساس میزان استفاده از CPU مرتب شده‌اند، ارائه می‌دهد.

    adb shell top -m 10  # Show top 10 processes
    
  • procrank : جزئیات دقیقی از میزان استفاده از حافظه برای یک فرآیند خاص یا کل سیستم ارائه می‌دهد.

    adb shell procrank
    

برای وضعیت سرویس از dumpsys استفاده کنید

dumpsys ابزاری قدرتمند برای پرس‌وجو از وضعیت داخلی هر سرویس سیستم اندروید است.

# List all available services
adb shell dumpsys -l

# Dump the state of a specific service or agent
adb shell dumpsys <service_name>

استفاده از torq برای تحلیل عملکرد

torq یک ابزار خط فرمان است که وظایف پروفایلینگ و ردیابی را در اندروید ساده می‌کند. این ابزار امکان اجرای Simpleperf، Perfetto و سایر وظایف معمول را در حین تجزیه و تحلیل عملکرد سیستم فراهم می‌کند.

برای ردیابی از Perfetto استفاده کنید

Perfetto ابزاری استاندارد برای ردیابی در سطح سیستم در اندروید است. Perfetto به شما امکان می‌دهد رویدادهای سیستم، نقاط ردیابی در سطح برنامه و شمارنده‌های عملکرد را ثبت کرده و آنها را در یک جدول زمانی به تصویر بکشید.

مراحل کلیدی:

  1. نقاط ردیابی را در کد C++ یا Rust خود اضافه کنید:
    • سی پلاس پلاس: از کیت توسعه نرم‌افزار Perfetto به همراه ماکروهای TRACE_EVENT استفاده کنید.
    • زنگ: از جعبه tracing استفاده کنید، که رویدادهای ATrace سازگار با Perfetto را منتشر می‌کند.
  2. یک فایل پیکربندی textproto ایجاد کنید تا منابع داده (برای مثال، ftrace ، track_event )، دسته‌ها و برچسب‌ها را مشخص کنید.
  3. از اسکریپت record_android_trace ( external/perfetto/tools/record_android_trace ) به همراه فایل پیکربندی خود برای ثبت ردپا از دستگاه استفاده کنید.
  4. فایل ردیابی تولید شده را در رابط کاربری وب Perfetto باز کنید تا رفتار سیستم را تجزیه و تحلیل کنید، گلوگاه‌ها را شناسایی کنید و تعاملات سرویس‌ها را درک کنید.

برای دستورالعمل‌های دقیق در مورد ابزار دقیق، پیکربندی و جمع‌آوری، به «استفاده از ردیابی برای کسب بینش در مورد عملکرد سیستم» مراجعه کنید.

استفاده از Simpleperf برای پروفایلینگ

Simpleperf یک ابزار خط فرمان همه‌کاره برای پروفایل عملکرد در اندروید است، مشابه perf لینوکس.

موارد استفاده رایج:

  • پروفایلینگ CPU: شناسایی توابعی که بیشترین زمان CPU را مصرف می‌کنند.
  • تحلیل خارج از CPU: تحلیل کنید که چرا نخ‌ها به خواب رفته یا مسدود شده‌اند.
  • شمارنده‌های سخت‌افزاری: به شمارنده‌های عملکرد سخت‌افزار دسترسی پیدا کنید.

دستورات مثال:

# Go to simpleperf scripts
cd system/extras/simpleperf/scripts

# Profile system for 20 seconds and record call graph
./app_profiler.py --system_wide -r "--call-graph fp --duration 20"

# Record a profile for a specific process (PID 1)
./app_profiler.py --pid 1 -r "--call-graph fp --duration 5"

# Pull the profile data
adb pull /data/local/tmp/perf.data .

# Generate a report with symbol resolution
./report_html.py --add_source_code --source_dirs $ANDROID_BUILD_TOP --add_disassembly -o report.html

Simpleperf رویدادها و گزینه‌های بسیار بیشتری ارائه می‌دهد. برای مشاهده مستندات جامع به راهنمای Simpleperf مراجعه کنید.

انکارهای SELinux

نشانه : سرویس شما در شروع، دسترسی به یک فایل یا استفاده از یک قابلیت با شکست مواجه می‌شود و شما پیام avc: denied را در dmesg یا logcat مشاهده می‌کنید.

[ 123.456] avc: denied { read } for pid=789 comm="my_service" name="some_file" dev="sda1" ino=123 scontext=u:r:my_service_t:s0 tcontext=u:object_r:some_file_t:s0 tclass=file permissive=0

اشکال‌زدایی سریع (فقط برای توسعه)

شما می‌توانید اجرای SELinux را موقتاً غیرفعال کنید تا ببینید آیا مشکل حل می‌شود یا خیر. این تأیید می‌کند که مشکل به دلیل عدم وجود یک قانون سیاست SELinux است.

# Disabling SELinux requires root permission
adb root

# Set SELinux to permissive mode
adb shell setenforce 0

# Check the current mode (should return "Permissive")
adb shell getenforce

رفع مشکل : ابزار audit2allow از درخت سورس اندروید روی پیام رد درخواست. این ابزار، قانون صحیح خط‌مشی .te را برای افزودن به پیکربندی SELinux دستگاه شما تولید می‌کند.