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

Android Studio اشکال‌زدایی ارائه می‌دهد که به شما امکان می‌دهد کارهای زیر و موارد دیگر را انجام دهید:

  • دستگاهی را برای اشکال‌زدایی برنامه‌تان انتخاب کنید.
  • نقطه‌های توقف را در کد Java،‏ Kotlin، و C/C++‎ تنظیم کنید.
  • متغیرها را بررسی کنید و عبارت‌ها را در زمان اجرا ارزیابی کنید.

این صفحه شامل دستورالعمل‌هایی برای عملیات اشکال‌زدایی پایه است. برای مستندات بیشتر، همچنین اسناد اشکال‌زدایی IntelliJ IDEA را ببینید.

فعال کردن اشکال‌زدایی

قبل‌از شروع اشکال‌زدایی، کارهای زیر را انجام دهید:

اشکال‌زدایی را در دستگاهتان فعال کنید.
اگر از شبیه‌ساز استفاده می‌کنید، اشکال‌زدایی به‌طور پیش‌فرض فعال است. اما برای دستگاه متصل‌شده، باید اشکال‌زدایی را در گزینه‌های توسعه‌دهنده دستگاه فعال کنید.
یک تنوع ساخت قابل‌اشکال‌زدایی را اجرا کنید.

از تنوع ساختی استفاده کنید که debuggable true (isDebuggable = true در اسکریپت‌های Kotlin) را در پیکربندی ساخت داشته باشد.

معمولاً می‌توانید نوع «اشکال‌زدایی» پیش‌فرض را که در هر پروژه «استودیو Android» گنجانده شده است انتخاب کنید، حتی اگر در فایل build.gradle قابل‌مشاهده نباشد. بااین‌حال، اگر انواع ساخت جدیدی را تعریف کنید که باید قابل‌اشکال‌زدایی باشند، باید debuggable true را به نوع ساخت اضافه کنید:

شیک

android {
    buildTypes {
        customDebugType {
            debuggable true
            ...
        }
    }
}

کاتلین

android {
    buildTypes {
        create("customDebugType") {
            isDebuggable = true
            ...
        }
    }
}

این ویژگی برای واحدهای دارای کد C/C++ نیز اعمال می‌شود.

توجه: خصوصیت jniDebuggable دیگر استفاده نمی‌شود.

اگر برنامه‌تان به ماژول کتابخانه‌ای وابسته است که می‌خواهید آن را نیز اشکال‌زدایی کنید، آن کتابخانه نیز باید با debuggable true بسته‌بندی شود تا نمادهای اشکال‌زدایی آن حفظ شود. برای اطمینان از اینکه انواع قابل‌اشکال‌زدایی پروژه برنامه‌تان نوع قابل‌اشکال‌زدایی واحد کتابخانه را دریافت می‌کند، نسخه‌های غیرپیش‌فرض کتابخانه‌تان را منتشر کنید.

شروع اشکال‌زدایی

می‌توانید جلسه اشکال‌زدایی را به‌صورت زیر شروع کنید:

  1. نقطه‌های توقف را در کد برنامه‌تان تنظیم کنید.
  2. در نوارابزار، دستگاهی را از منو دستگاه هدف انتخاب کنید تا اشکال‌زدایی برنامه‌تان در آن انجام شود.
    منو دستگاه هدف.
    شکل ۱. منو دستگاه هدف.

    اگر دستگاهی را پیکربندی نکرده‌اید، باید دستگاهی را ازطریق USB متصل کنید، دستگاهی را ازطریق Wi-Fi متصل کنید، یا یک AVD ایجاد کنید تا بتوانید از شبیه‌ساز Android استفاده کنید.

  3. در نوارابزار، روی اشکال‌زدایی کلیک کنید.

    اگر برنامه‌تان ازقبل در دستگاه درحال اجرا باشد، کادر گفتگویی نمایش داده می‌شود که از شما می‌پرسد آیا می‌خواهید از «اجرا» به «اشکال‌زدایی» بروید. برای شروع اشکال‌زدایی، دستگاه باید بازراه‌اندازی شود. برای ادامه اجرای همان نمونه برنامه، روی لغو اشکال‌زدایی کلیک کنید و به‌جای آن اشکال‌زدا را به برنامه درحال اجرا پیوست کنید. درغیراین‌صورت، Android Studio یک APK می‌سازد، آن را با کلید اشکال‌زدایی امضا می‌کند، آن را روی دستگاه انتخابی شما نصب می‌کند، و آن را اجرا می‌کند.

    اگر کد C و C++‎ به پروژه‌تان اضافه کنید، «استودیو Android» همچنین اشکال‌زدای LLDB را در پنجره «اشکال‌زدایی» اجرا می‌کند تا کد بومی شما را اشکال‌زدایی کند.

  4. اگر پنجره «اشکال‌زدایی» باز نیست، مشاهده > پنجره‌های ابزار > اشکال‌زدایی را انتخاب کنید، یا روی اشکال‌زدایی در نوار پنجره ابزار کلیک کنید.

پیوست کردن اشکال‌زدا به برنامه درحال اجرا

اگر برنامه‌تان ازقبل در دستگاهتان درحال اجرا است، می‌توانید بدون بازراه‌اندازی برنامه‌تان، اشکال‌زدایی را به‌صورت زیر شروع کنید:

  1. روی پیوست کردن اشکال‌زدا به فرایند Android کلیک کنید.
  2. در کادر گفتگوی انتخاب فرایند، فرایندی را که می‌خواهید اشکال‌زدا به آن متصل شود انتخاب کنید.
    1. اگر از شبیه‌ساز یا دستگاه با دسترسی ریشه‌ای استفاده می‌کنید، می‌توانید نمایش همه فرایندها را علامت بزنید تا همه فرایندها را ببینید. در دستگاه با دسترسی ریشه‌ای، این گزینه همه فرایندهای درحال اجرا در دستگاه را نشان می‌دهد. بااین‌حال، در دستگاهی که دسترسی ریشه‌ای ندارد، این فقط فرایندهای قابل‌اشکال‌زدایی را نشان می‌دهد.
    2. از منو استفاده از تنظیمات اشکال‌زدای Android از، می‌توانید پیکربندی اجرا/اشکال‌زدایی موجود را انتخاب کنید. برای کد C و C++‎، این به شما امکان می‌دهد از فرمان‌های راه‌اندازی LLDB، فرمان‌های پس‌از پیوست LLDB، و دایرکتوری‌های نماد در پیکربندی موجود مجدداً استفاده کنید.
    3. اگر پیکربندی اجرا/اشکال‌زدایی موجودی ندارید، ایجاد پیکربندی جدید را انتخاب کنید. با این انتخاب، منو نوع اشکال‌زدایی فعال می‌شود که در آن می‌توانید نوع اشکال‌زدایی دیگری را انتخاب کنید. به‌طور پیش‌فرض، Android Studio از نوع اشکال‌زدایی «تشخیص خودکار» استفاده می‌کند تا بهترین گزینه اشکال‌زدا را براساس اینکه پروژه‌تان شامل کد Java یا C/C++‎ است برایتان انتخاب کند.
  3. روی تأیید کلیک کنید.

    پنجره «اشکال‌زدایی» ظاهر می‌شود.

برگه فرایندها در «کاوشگر دستگاه» (مشاهده > پنجره‌های ابزار > کاوشگر دستگاه) نیز فهرستی از فرایندهای قابل‌اشکال‌زدایی دارد. از آنجا می‌توانید فرایندی را انتخاب کنید و آن را متوقف کنید ، توقف اجباری کنید ، یا اشکال‌زدا را به فرایند موردنظر پیوست کنید .

پنجره اشکال‌زدایی

شکل ۲.پنجره «اشکال‌زدایی».

پنجره اشکال‌زدایی به این بخش‌ها تقسیم می‌شود

  1. نوارابزار اجرا و پیمایش کار با نقاط توقف را ببینید
  2. انتخاب‌گر رشته
  3. ارزیابی و تماشای ورودی عبارت. بازرسی متغیرها را ببینید.
  4. نمایشگر پشته‌ای
  5. قاب متغیرها. بازرسی متغیرها را ببینید.

توجه: اشکال‌زدا و زباله‌روب Android Studio به‌طور ضعیف ادغام شده‌اند. ماشین مجازی Android تضمین می‌کند که هر شیئی که اشکال‌زدا از آن مطلع است تا زمانی که اشکال‌زدا قطع نشود، جمع‌آوری زباله نمی‌شود. این امر می‌تواند منجر به تجمع اشیاء درحین اتصال اشکال‌زدا شود. برای مثال، اگر اشکال‌زدا رشته‌ای درحال اجرا را ببیند، شیء Thread مرتبط تا زمانی که اشکال‌زدا قطع نشود، حتی اگر رشته پایان یافته باشد، جمع‌آوری زباله نمی‌شود.

تغییر نوع اشکال‌زدا

چون برای اشکال‌زدایی کد Java/Kotlin و کد C/C++‎ به ابزارهای اشکال‌زدایی متفاوتی نیاز است، اشکال‌زدای «استودیو Android» به شما امکان می‌دهد نوع اشکال‌زدا را برای استفاده انتخاب کنید. به‌طور پیش‌فرض، «استودیو Android» تصمیم می‌گیرد که از کدام اشکال‌زدا براساس زبان‌هایی که در پروژه شما شناسایی می‌کند استفاده کند. این کار بااستفاده از نوع اشکال‌زدای تشخیص خودکار انجام می‌شود.

برای انتخاب دستی اشکال‌زدا در پیکربندی اشکال‌زدایی، روی اجرا > ویرایش پیکربندی‌ها کلیک کنید. همچنین می‌توانید اشکال‌زدا را در کادر گفتگویی که هنگام کلیک کردن روی اجرا > پیوست کردن اشکال‌زدا به فرایند Android ظاهر می‌شود انتخاب کنید.

انواع اشکال‌زدایی دردسترس شامل موارد زیر است:

تشخیص خودکار
اگر می‌خواهید Android Studio به‌طور خودکار بهترین گزینه را برای کدی که اشکال‌زدایی می‌کنید انتخاب کند، این نوع اشکال‌زدایی را انتخاب کنید. برای مثال، اگر کد C یا C++‎ در پروژه‌تان دارید، «استودیو Android» به‌طور خودکار از نوع اشکال‌زدایی «دوگانه» استفاده می‌کند. درغیراین‌صورت، «استودیو Android» از نوع اشکال‌زدایی «فقط Java» استفاده می‌کند.
فقط جاوا
اگر می‌خواهید فقط کدهای نوشته‌شده در Java یا Kotlin را اشکال‌زدایی کنید، این نوع اشکال‌زدایی را انتخاب کنید. اشکال‌زدای Java-Only هرگونه نقطه گسست یا ساعت را که در کد بومی‌تان تنظیم کرده‌اید نادیده می‌گیرد.
فقط بومی (فقط با کد C/C++‎ دردسترس است)
اگر می‌خواهید فقط از LLDB برای اشکال‌زدایی کدتان استفاده کنید، این نوع اشکال‌زدایی را انتخاب کنید. هنگام استفاده از این نوع اشکال‌زدایی، نمای جلسه اشکال‌زدای Java دردسترس نیست. به‌طور پیش‌فرض، LLDB فقط کد بومی شما را بازرسی می‌کند و نقاط توقف را در کد Java شما نادیده می‌گیرد. اگر می‌خواهید کد Java را نیز اشکال‌زدایی کنید، به نوع اشکال‌زدایی «تشخیص خودکار» یا «دوگانه» بروید.

اشکال‌زدایی بومی فقط در دستگاه‌هایی کار می‌کند که الزامات زیر را برآورده کنند:

  • دستگاه از run-as پشتیبانی می‌کند.

    برای بررسی اینکه دستگاه از run-as پشتیبانی می‌کند یا نه، فرمان زیر را در پوسته ADB که به دستگاهتان متصل است اجرا کنید:

    run-as your-package-name pwd
    

    your-package-name را با نام بسته برنامه‌تان جایگزین کنید. اگر دستگاه از run-as پشتیبانی کند، فرمان باید بدون هیچ خطایی برگردانده شود.

  • ptrace در دستگاه فعال باشد.

    برای بررسی اینکه ptrace فعال است یا نه، فرمان زیر را در پوسته ADB که به دستگاهتان متصل است اجرا کنید:

    sysctl kernel.yama.ptrace_scope
    

    اگر ptrace فعال باشد، فرمان مقدار 0 یا خطای unknown key را چاپ خواهد کرد. اگر ptrace فعال نباشد، مقداری غیراز 0 را چاپ خواهد کرد.

دوگانه (Java + بومی) - فقط با کد C/C++‎ دردسترس است
اگر می‌خواهید بین اشکال‌زدایی کد Java و کد بومی جابه‌جا شوید، این نوع اشکال‌زدایی را انتخاب کنید. ‫Android Studio هم اشکال‌زدای Java و هم LLDB را به فرایند برنامه شما متصل می‌کند تا بتوانید نقاط توقف را هم در کد Java و هم در کد بومی بدون راه‌اندازی مجدد برنامه یا تغییر پیکربندی اشکال‌زدایی بررسی کنید.

در شکل ۲، به دو برگه در سمت راست عنوان پنجره «اشکال‌زدایی» توجه کنید. چون برنامه هم کد Java دارد و هم کد C++‎، یک برگه برای اشکال‌زدایی کد بومی است و برگه دیگر برای اشکال‌زدایی کد Java، که با -java نشان داده می‌شود.

شکل ۳. برگه اشکال‌زدایی کد بومی و برگه اشکال‌زدایی کد Java.

توجه: هنگام اشکال‌زدایی کد بومی که توسط کامپایلر بهینه‌سازی شده است، ممکن است پیام هشدار زیر را دریافت کنید:
This function was compiled with optimizations enabled. Some debugger features may not be available. هنگام استفاده از پرچم‌های بهینه‌سازی، کامپایلر تغییراتی در کد کامپایل‌شده شما ایجاد می‌کند تا کارآمدتر اجرا شود. این امر می‌تواند باعث شود اشکال‌زدا اطلاعات غیرمنتظره یا نادرستی را گزارش کند، زیرا برای اشکال‌زدا دشوار است که کد کامپایل‌شده بهینه‌سازی‌شده را به کد منبع اصلی نگاشت کند. به‌همین دلیل، باید بهینه‌سازی‌های کامپایلر را هنگام اشکال‌زدایی کد بومی غیرفعال کنید.

استفاده از گزارش سیستم

گزارش سیستم پیام‌های سیستم را هنگام اشکال‌زدایی برنامه نشان می‌دهد. این پیام‌ها شامل اطلاعاتی از برنامه‌های درحال اجرا در دستگاه است. اگر می‌خواهید از گزارش سیستم برای اشکال‌زدایی برنامه‌تان استفاده کنید، مطمئن شوید که کد شما پیام‌های گزارش را می‌نویسد و ردیابی پشته را برای استثناها درحالی‌که برنامه‌تان در مرحله توسعه است چاپ می‌کند.

نوشتن پیام‌های گزارش در کد

برای نوشتن پیام‌های گزارش در کدتان، از کلاس Log استفاده کنید. پیام‌های گزارش به شما کمک می‌کند تا با جمع‌آوری خروجی اشکال‌زدایی سیستم درحین تعامل با برنامه، جریان اجرا را درک کنید. پیام‌های گزارش همچنین می‌توانند به شما بگویند کدام بخش از برنامه شما ناموفق بوده است. برای کسب اطلاعات بیشتر درباره ثبت گزارش، به نوشتن و مشاهده گزارش‌ها با Logcat مراجعه کنید.

مثال زیر نشان می‌دهد که چگونه می‌توانید پیام‌های گزارش را اضافه کنید تا مشخص شود آیا اطلاعات وضعیت قبلی هنگام شروع فعالیت شما دردسترس است یا نه:

کاتلین

import android.util.Log
...
class MyActivity : Activity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state")
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available")
            /* initialize app */
        }
        ...
    }
  ...
  companion object {
    private val TAG: String = MyActivity::class.java.simpleName
    ...
  }
}

جاوا

import android.util.Log;
...
public class MyActivity extends Activity {
    private static final String TAG = MyActivity.class.getSimpleName();
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
       ...
       if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state");
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available");
            /* initialize app */
        }
        ...
    }
}

درطول توسعه، کد شما همچنین می‌تواند استثناها را بگیرد و ردیابی پشته را در گزارش سیستم بنویسد:

کاتلین

fun someOtherMethod() {
    try {
        ...
    } catch (e : SomeException) {
        Log.d(TAG, "someOtherMethod()", e)
    }
}

جاوا

void someOtherMethod() {
    try {
        ...
    } catch (SomeException e) {
        Log.d(TAG, "someOtherMethod()", e);
    }
}

توجه: وقتی برای انتشار برنامه‌تان آماده هستید، پیام‌های گزارش اشکال‌زدایی و فراخوانی‌های چاپ ردیابی پشته را از کدتان بردارید. برای انجام این کار، پرچم DEBUG را تنظیم کنید و پیام‌های گزارش اشکال‌زدایی را در دستورهای شرطی قرار دهید.

مشاهده گزارش سیستم

می‌توانید پیام‌های اشکال‌زدایی و سایر پیام‌های سیستم را در پنجره Logcat مشاهده و فیلتر کنید، همان‌طور که در شکل ۴ نشان داده شده است. برای مثال، می‌توانید پیام‌هایی را که هنگام جمع‌آوری زباله رخ می‌دهد یا پیام‌هایی را که با کلاس Log به برنامه‌تان اضافه می‌کنید ببینید.

برای استفاده از Logcat، اشکال‌زدایی را شروع کنید و برگه Logcat را انتخاب کنید.

شکل ۴. پنجره Logcat با تنظیمات فیلتر.

برای شرح Logcat و گزینه‌های فیلتر کردن آن، نوشتن و مشاهده گزارش‌ها با Logcat را ببینید.

کار کردن با نقاط توقف

Android Studio از نقاط توقفی پشتیبانی می‌کند که کنش‌های اشکال‌زدایی مختلفی را راه‌اندازی می‌کنند. چندین نوع نقطه گسست وجود دارد:

نقطه گسست خط
رایج‌ترین نوع، نقطه توقف خطی است که اجرای برنامه را در خط مشخصی از کد متوقف می‌کند. درطول توقف موقت، می‌توانید متغیرها را بررسی کنید، عبارت‌ها را ارزیابی کنید، و سپس اجرا را خط‌به‌خط ادامه دهید تا علت خطاهای زمان اجرا را تعیین کنید.
نقطه گسست روش
نقطه توقف روش، اجرای برنامه را هنگام ورود به روشی خاص یا خروج از آن موقتاً متوقف می‌کند. درطول توقف موقت، می‌توانید متغیرها را بررسی کنید، عبارت‌ها را ارزیابی کنید، و سپس اجرا را خط‌به‌خط ادامه دهید تا علت خطاهای زمان اجرا را تعیین کنید. وقتی نقطه توقفی را روی یک تابع ترکیب‌پذیر تنظیم می‌کنید، اشکال‌زدا پارامترهای ترکیب‌پذیر و وضعیت آن‌ها را فهرست می‌کند تا به شناسایی تغییراتی که ممکن است باعث ترکیب مجدد شده باشند کمک کند.
نقطه گسست فیلد
نقطه توقف فیلد اجرای برنامه را وقتی از فیلد خاصی می‌خواند یا در آن می‌نویسد موقتاً متوقف می‌کند.
نقطه گسست استثنا
نقطه توقف استثنا اجرای برنامه شما را هنگام ایجاد استثنا موقتاً متوقف می‌کند.

می‌توانید نقاط توقف شرطی تنظیم کنید که فقط درصورت برآورده شدن شرایط خاص، اجرا را تعلیق می‌کنند. همچنین می‌توانید نقاط توقف ثبت گزارش را تنظیم کنید که بدون تعلیق اجرا، در Logcat بنویسند. این کار می‌تواند به جلوگیری از شلوغ شدن کد شما با دستورات گزارش کمک کند.

برای افزودن نقطه گسست خط، به‌صورت زیر عمل کنید:

  1. خط کدی را که می‌خواهید اجرا در آنجا موقتاً متوقف شود پیدا کنید.
  2. روی حاشیه چپ در امتداد آن خط کد کلیک کنید یا مکان‌نما را روی خط قرار دهید و Control+F8 (در macOS،‏ Command+F8) را فشار دهید.
  3. اگر برنامه‌تان ازقبل درحال اجرا است، روی پیوست کردن اشکال‌زدا به فرایند Android کلیک کنید. درغیراین‌صورت، برای شروع اشکال‌زدایی، روی اشکال‌زدایی کلیک کنید.

وقتی نقطه توقف تنظیم می‌کنید، نقطه قرمزی در کنار خط ظاهر می‌شود، همان‌طور که در شکل ۵ نشان داده شده است.

شکل ۵. وقتی نقطه توقف تنظیم می‌کنید، نقطه قرمزی در کنار خط ظاهر می‌شود.

وقتی اجرای کد به نقطه توقف می‌رسد، Android Studio اجرای برنامه را موقتاً متوقف می‌کند.

برای شناسایی وضعیت برنامه، از ابزارهای برگه «اشکال‌زدا» استفاده کنید:

  • برای بررسی درخت شیء برای یک متغیر، آن را در نمای «متغیرها» ازهم باز کنید. اگر نمای «متغیرها» قابل‌مشاهده نیست، روی تنظیمات چیدمان کلیک کنید و مطمئن شوید که متغیرها علامت زده شده باشد.

  • برای رفتن به خط بعدی در کد بدون وارد کردن روش، روی رد شدن از مرحله کلیک کنید.

  • برای رفتن به اولین خط در فراخوانی روش، روی ورود به تابع کلیک کنید.

  • برای رفتن به خط بعدی خارج از روش فعلی، روی خروج از تابع کلیک کنید.

  • برای ادامه اجرای عادی برنامه، روی ازسر گرفتن برنامه کلیک کنید.

اگر پروژه‌تان از کد بومی استفاده می‌کند، به‌طور پیش‌فرض نوع اشکال‌زدایی «تشخیص خودکار» هم اشکال‌زدای Java و هم LLDB را به‌عنوان دو فرایند جداگانه به برنامه‌تان پیوست می‌کند. می‌توانید بین بازرسی نقاط توقف Java و C/C++‎ جابه‌جا شوید بدون اینکه لازم باشد برنامه‌تان را بازراه‌اندازی کنید یا تنظیمات را تغییر دهید.

توجه: برای اینکه «استودیو Android» بتواند نقاط گسست را در کد C یا C++‎ شما شناسایی کند، باید از نوع اشکال‌زدایی‌ای استفاده کنید که از LLDB پشتیبانی می‌کند، مثل «تشخیص خودکار»، «بومی»، یا «دوگانه». می‌توانید نوع اشکال‌زدایی را که «استودیو Android» استفاده می‌کند با ویرایش پیکربندی اشکال‌زدایی تغییر دهید. برای آشنایی بیشتر با انواع مختلف اشکال‌زدایی، بخش مربوط به استفاده از دیگر انواع اشکال‌زدایی را بخوانید.

وقتی Android Studio برنامه‌تان را در دستگاه هدف مستقر می‌کند، پنجره «اشکال‌زدایی» با یک برگه یا نمای جلسه اشکال‌زدایی برای هر فرایند اشکال‌زدا باز می‌شود، همان‌طور که در شکل ۶ نشان داده شده است.

شکل ۶.‏ اشکال‌زدایی کد بومی بااستفاده از LLDB.
  1. وقتی اشکال‌زدای LLDB با نقطه توقف در کد C/C++‎ مواجه می‌شود، «استودیو Android» به برگه <your-module> می‌رود. قاب‌های Frames،‏ Variables، و Watches نیز دردسترس هستند و دقیقاً همان‌طور که کد Java را اشکال‌زدایی می‌کنید کار می‌کنند.

    اگرچه صفحه «رشته‌ها» در نمای جلسه LLDB دردسترس نیست، می‌توانید بااستفاده از فهرست موجود در صفحه «قاب‌ها» به فرایندهای برنامه‌تان دسترسی پیدا کنید. درباره این قاب‌ها در بخش‌های مربوط به نحوه اشکال‌زدایی قاب‌های پنجره و بازرسی متغیرها بیشتر بدانید.

    توجه: هنگام بازرسی نقطه توقف در کد بومی، سیستم Android ماشین مجازی را که بایت‌کد Java برنامه شما را اجرا می‌کند تعلیق می‌کند. این یعنی نمی‌توانید با اشکال‌زدای Java تعامل داشته باشید یا اطلاعات وضعیت را از جلسه اشکال‌زدای Java درحین بازرسی نقطه توقف در کد بومی بازیابی کنید.

  2. وقتی اشکال‌زدای Java با نقطه توقف در کد Java یا Kotlin شما مواجه می‌شود، «استودیو Android» به برگه <your-module>-java می‌رود.
  3. هنگام اشکال‌زدایی با LLDB، می‌توانید از پایانه LLDB در نمای جلسه LLDB برای ارسال گزینه‌های خط فرمان به LLDB استفاده کنید. اگر فرمان‌های خاصی دارید که می‌خواهید LLDB هربار که اشکال‌زدایی برنامه‌تان را شروع می‌کنید اجرا کند، چه درست قبل یا درست بعداز اینکه اشکال‌زدا به فرایند برنامه‌تان متصل می‌شود، می‌توانید آن فرمان‌ها را به پیکربندی اشکال‌زدایی‌تان اضافه کنید.

هنگام اشکال‌زدایی کد C/C++‎، می‌توانید انواع خاصی از نقاط توقف را نیز تنظیم کنید، که به آن‌ها نقاط نظارت می‌گویند، که می‌توانند فرایند برنامه شما را زمانی که برنامه شما با یک بلوک خاص از حافظه تعامل دارد، تعلیق کنند. برای کسب اطلاعات بیشتر، بخش مربوط به نحوه افزودن نقاط نظارت را بخوانید.

مشاهده و پیکربندی نقاط گسست

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

شکل ۷. پنجره «نقاط توقف» همه نقاط توقف فعلی را فهرست می‌کند و شامل تنظیمات رفتار برای هرکدام است.

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

نقطه توقفی را از فهرست انتخاب کنید تا تنظیمات آن را پیکربندی کنید. می‌توانید نقطه توقف را طوری پیکربندی کنید که ابتدا غیرفعال باشد و سیستم آن را پس‌از رسیدن به نقطه توقف دیگری فعال کند. همچنین می‌توانید پیکربندی کنید که آیا نقطه توقف باید پس‌از رسیدن به آن غیرفعال شود یا نه. برای تنظیم نقطه توقف برای هر استثنا، نقطه توقف استثنا را در فهرست نقاط توقف انتخاب کنید.

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

قاب‌های پنجره اشکال‌زدایی

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

برای انتخاب رشته، از منو انتخابگر رشته استفاده کنید و چارچوب پشته‌ای آن را مشاهده کنید. روی عناصر در قاب کلیک کنید تا منبع در ویرایشگر باز شود. همچنین می‌توانید ارائه رشته را سفارشی‌سازی کنید و چارچوب پشته‌ای را همان‌طور که در راهنمای بررسی چارچوب‌ها توضیح داده شده است صادر کنید.

بررسی متغیرها

در پنجره «اشکال‌زدا»، صفحه «متغیرها» به شما امکان می‌دهد متغیرها را وقتی سیستم برنامه‌تان را در نقطه توقف متوقف می‌کند و قابی را از صفحه «قاب‌ها» انتخاب می‌کنید بازرسی کنید. همچنین، پانل «متغیرها» به شما امکان می‌دهد عبارت‌های موقت را بااستفاده از روش‌های ایستا و/یا متغیرهای دردسترس در قاب انتخاب‌شده ارزیابی کنید.

برای افزودن عبارت به درخت شیء (درحالی‌که برنامه درحال اشکال‌زدایی است):

شکل ۸. درخت شیء و چارگوش ورودی عبارت در پنجره «اشکال‌زدایی».
  1. عبارت را برای تماشا یا نمایش وارد کنید
  2. روی افزودن به دیده‌بان‌ها کلیک کنید یا کلید Enter را فشار دهید تا عبارت یک‌بار ارزیابی شود.

یا اگر درخت شیء حاوی عبارتی است که می‌خواهید تماشا کنید، می‌توانید آن را به بالای درخت بکشید تا به‌عنوان عبارت تماشاشده اضافه شود.

عبارت‌های تحت‌نظر وقتی نقطه توقف‌ها فعال شوند یا کد را گام‌به‌گام اجرا کنید به‌روزرسانی خواهند شد.

عبارت‌های ارزیابی‌شده تا زمانی که عبارت دیگری را به‌صورت دستی ارزیابی نکنید یا کدتان را گام‌به‌گام اجرا نکنید، در بالای درخت شیء نمایش داده خواهند شد.

برای برداشتن عبارت تحت‌نظر از درخت شیء، روی عبارت کلیک راست کنید و سپس روی برداشتن تحت‌نظر کلیک کنید.

افزودن نقاط نظارت

هنگام اشکال‌زدایی کد C/C++‎، می‌توانید انواع خاصی از نقاط توقف را تنظیم کنید که نقاط نظارت نامیده می‌شوند و می‌توانند فرایند برنامه شما را زمانی که برنامه با بلوک خاصی از حافظه تعامل دارد، تعلیق کنند. برای مثال، اگر دو اشاره‌گر را برای یک بلوک حافظه تنظیم کنید و یک نقطه نظارت به آن اختصاص دهید، استفاده از هرکدام از اشاره‌گرها برای دسترسی به آن بلوک حافظه، نقطه نظارت را فعال می‌کند.

در Android Studio، می‌توانید با انتخاب متغیری خاص، درطول زمان اجرا نقطه دید ایجاد کنید، اما LLDB نقطه دید را فقط به بلوک حافظه‌ای اختصاص می‌دهد که سیستم به آن متغیر اختصاص می‌دهد، نه خود متغیر. این با افزودن متغیر به قاب «ساعت‌ها» متفاوت است، که به شما امکان می‌دهد مقدار متغیر را مشاهده کنید اما به شما اجازه نمی‌دهد فرایند برنامه را وقتی سیستم مقدار آن را در حافظه می‌خواند یا تغییر می‌دهد تعلیق کنید.

توجه: وقتی فرایند برنامه شما از تابعی خارج می‌شود و سیستم متغیرهای محلی آن را از حافظه آزاد می‌کند، باید هر نقطه نظارتی را که برای آن متغیرها ایجاد کرده‌اید دوباره اختصاص دهید.

برای تنظیم نقطه دیده‌بانی، باید شرایط زیر را داشته باشید:

  • دستگاه فیزیکی یا شبیه‌ساز هدف شما از CPU x86 یا x86_64 استفاده می‌کند. اگر دستگاهتان از CPU ARM استفاده می‌کند، باید مرز نشانی متغیرتان را در حافظه با ۴ بایت (برای پردازنده‌های ۳۲ بیتی) یا ۸ بایت (برای پردازنده‌های ۶۴ بیتی) تراز کنید. برای تراز کردن متغیر در کد بومی، __attribute__((aligned(num_bytes))) را در کاهش سرعت متغیر مشخص کنید، همان‌طور که در زیر نشان داده شده است:
    // For a 64-bit ARM processor
    int my_counter __attribute__((aligned(8)));
  • قبلاً سه نقطه نظارت یا کمتر اختصاص داده‌اید. Android Studio فقط از حداکثر چهار نقطه دیده‌بانی در دستگاه‌های هدف x86 یا x86_64 پشتیبانی می‌کند. سایر دستگاه‌ها ممکن است از نقاط دیده‌بانی کمتری پشتیبانی کنند.

توجه: هنگام اشکال‌زدایی برنامه با ABIهای ARM‏ ۳۲ بیتی، افزودن نقطه نظارت یا نگه داشتن نشانگر روی متغیرهای داخل کد برای بررسی مقادیر آن‌ها ممکن است باعث ازکارافتادن شود. به‌عنوان راه‌حل، بااستفاده از ARM‏ ۶۴ بیتی، x86، یا x86_64 باینری اشکال‌زدایی کنید. این مشکل در نسخه آتی Android Studio برطرف خواهد شد.

اگر شرایط لازم را دارید، می‌توانید به‌صورت زیر نقطه دیده‌بانی اضافه کنید:

  1. وقتی برنامه‌تان در نقطه توقف تعلیق شد، به قاب «متغیرها» در نمای جلسه LLDB بروید.
  2. روی متغیری که بلوک حافظه موردنظرتان برای ردیابی را اشغال کرده است کلیک راست کنید و افزودن نقطه نظارت را انتخاب کنید.

    شکل ۹. افزودن نقطه دیده‌بانی به متغیر در حافظه.
  3. کادر گفتگویی برای پیکربندی نقطه دیده‌بانی شما ظاهر می‌شود، همان‌طور که در شکل ۹ نشان داده شده است.

    نقطه دیده‌بانی را با گزینه‌های زیر پیکربندی کنید:

    • فعال: اگر می‌خواهید به Android Studio بگویید تا زمانی که تنظیم را تغییر نداده‌اید، نقطه دیده‌بانی را نادیده بگیرد، این گزینه را لغو انتخاب کنید. Android Studio نقطه دیده‌بانی را ذخیره می‌کند تا بتوانید بعداً به آن دسترسی داشته باشید.
    • تعلیق: به‌طور پیش‌فرض، سیستم Android فرایند برنامه‌تان را وقتی به بلوک حافظه‌ای که به نقطه دیده‌بانی اختصاص داده‌اید دسترسی پیدا می‌کند تعلیق می‌کند. اگر این رفتار را نمی‌خواهید، این گزینه را لغو انتخاب کنید. با این کار گزینه‌های بیشتری نشان داده می‌شود که می‌توانید از آن‌ها برای سفارشی‌سازی رفتار هنگام تعامل سیستم با نقطه دیده‌بانی استفاده کنید: ثبت پیام در کنسول و برداشتن هنگام برخورد.
    • نوع دسترسی: انتخاب کنید که آیا برنامه‌تان باید نقطه دیده‌بانی را وقتی فعال کند که می‌خواهد در بلوک حافظه‌ای که سیستم به متغیر اختصاص می‌دهد بخواند یا بنویسد. برای راه‌اندازی نقطه دیده‌بانی در خواندن یا نوشتن، هرکدام را انتخاب کنید.
  4. روی تمام کلیک کنید.

برای مشاهده همه نقاط نظارت و پیکربندی تنظیمات نقطه نظارت، روی مشاهده نقاط توقف در پنجره «اشکال‌زدایی» کلیک کنید. کادر گفتگوی «نقاط توقف» مطابق شکل ۱۰ ظاهر می‌شود.

شکل ۱۰. کادر گفتگوی «نقاط توقف» نقاط نظارت فعلی‌تان را فهرست می‌کند و شامل تنظیمات رفتار برای هرکدام است.

پس‌از افزودن نقطه دیده‌بانی، روی ازسر گرفتن برنامه در پنجره «اشکال‌زدایی» کلیک کنید تا فرایند برنامه ازسر گرفته شود. به‌طور پیش‌فرض، اگر برنامه‌تان سعی کند به بلوکی از حافظه که برای آن نقطه نظارت تنظیم کرده‌اید دسترسی پیدا کند، سیستم Android فرایند برنامه‌تان را تعلیق می‌کند و نماد نقطه نظارت در کنار خط کدی که برنامه‌تان آخرین بار اجرا کرده است ظاهر می‌شود، همان‌طور که در شکل ۱۱ نشان داده شده است.

شکل ۱۱. ‫Android Studio خط کدی را نشان می‌دهد که برنامه‌تان درست قبل‌از راه‌اندازی نقطه دید اجرا می‌کند.

مشاهده و تغییر قالب نمایش مقدار منبع

در حالت اشکال‌زدایی، می‌توانید مقادیر منبع را مشاهده کنید و قالب نمایش متفاوتی را برای متغیرها در کد Java یا Kotlin خود انتخاب کنید. وقتی برگه «متغیرها» نمایش داده می‌شود و قابی انتخاب شده است، کارهای زیر را انجام دهید:

  1. در فهرست «متغیرها»، روی هرجایی از خط منبع کلیک راست کنید تا فهرست نمایش داده شود.
  2. در فهرست، مشاهده به‌عنوان را انتخاب کنید و قالبی را که می‌خواهید استفاده کنید انتخاب کنید.

    قالب‌های دردسترس به نوع داده منبعی که انتخاب کرده‌اید بستگی دارد. ممکن است یک یا چند مورد از گزینه‌های زیر را ببینید:

    • کلاس: تعریف کلاس را نمایش می‌دهد.
    • toString: قالب رشته نمایش.
    • شیء: تعریف شیء (نمونه‌ای از کلاس) را نمایش می‌دهد.
    • آرایه: نمایش در قالب آرایه.
    • مُهر زمان: تاریخ و زمان را به‌صورت زیر نمایش دهید: yyyy-mm-dd hh:mm:ss.
    • خودکار: «استودیو Android» بهترین قالب را براساس نوع داده انتخاب می‌کند.
    • دودویی: نمایش مقدار دودویی بااستفاده از صفر و یک.
    • MeasureSpec: مقداری که از والد به فرزند انتخاب‌شده منتقل می‌شود. MeasureSpec را ببینید.
    • Hex: نمایش به‌عنوان مقدار شانزده‌شانزدهی.
    • اولیه: نمایش به‌عنوان مقدار عددی بااستفاده از نوع داده اولیه.
    • عدد صحیح: به‌عنوان مقدار عددی از نوع Integer نمایش داده می‌شود.

برای ایجاد قالب سفارشی، کارهای زیر را انجام دهید:

  1. روی مقدار منبع کلیک راست کنید.
  2. مشاهده به‌عنوان را انتخاب کنید.
  3. ایجاد کردن را انتخاب کنید.
  4. کادر گفتگوی Java Data Type Renderers نمایش داده می‌شود. دستورالعمل‌های موجود در پردازنده نوع داده Java را دنبال کنید.