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

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

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

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

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

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

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

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

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

شیار

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

کاتلین

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

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

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

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

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

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

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

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

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

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

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

  4. اگر پنجره Debug باز نیست، View > Tool Windows > Debug را انتخاب کنید یا روی Debug کلیک کنید. در نوار پنجره ابزار

دیباگر را به یک برنامه در حال اجرا وصل کنید

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

  1. روی پیوست کردن دیباگر به فرآیند اندروید کلیک کنید .
  2. در گفتگوی Choose Process ، فرآیندی را که می‌خواهید اشکال‌زدا را به آن وصل کنید، انتخاب کنید.
    1. اگر از یک شبیه ساز یا یک دستگاه روت شده استفاده می کنید، می توانید تیک Show all processes را بزنید تا همه فرآیندها را ببینید. در یک دستگاه روت شده، تمام فرآیندهای در حال اجرا روی دستگاه را نشان می دهد. با این حال، در یک دستگاه بدون ریشه، این فقط فرآیندهای قابل اشکال زدایی را نشان می دهد.
    2. از منوی Use Android Debugger Settings from ، می‌توانید یک پیکربندی اجرا/اشکال‌زدایی موجود را انتخاب کنید. برای کدهای C و C++، این به شما امکان می‌دهد از دستورات راه‌اندازی LLDB، دستورات پس از پیوست LLDB و فهرست‌های نماد در یک پیکربندی موجود استفاده مجدد کنید.
    3. اگر پیکربندی run/debug موجود ندارید، Create New را انتخاب کنید. این انتخاب منوی Debug Type را فعال می کند، جایی که می توانید نوع اشکال زدایی دیگری را انتخاب کنید . به‌طور پیش‌فرض، Android Studio از نوع Detect Automatically debug استفاده می‌کند تا بهترین گزینه اشکال‌زدا را بر اساس اینکه پروژه شما شامل کد جاوا یا C/C++ است، انتخاب کند.
  3. روی OK کلیک کنید.

    پنجره Debug ظاهر می شود.

برگه Processes در Device Explorer ( View > Tool Windows > Device Explorer ) نیز فهرستی از فرآیندهای قابل اشکال زدایی دارد. از آنجا می توانید یک فرآیند را انتخاب کنید و یک kill را انجام دهید ، توقف اجباری ، یا دیباگر را به یک فرآیند معین وصل کنید .

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

شکل 2. پنجره Debug.

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

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

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

نوع دیباگر را تغییر دهید

از آنجایی که برای اشکال زدایی کد جاوا/کوتلین و کد C/C++ به ابزارهای مختلف دیباگر نیاز است، دیباگر Android Studio به شما امکان می دهد نوع اشکال زدایی را انتخاب کنید. به‌طور پیش‌فرض، Android Studio بر اساس زبان‌هایی که در پروژه شما با استفاده از نوع Detect Automatically debugger شناسایی می‌کند، تصمیم می‌گیرد از کدام دیباگر استفاده کند.

برای انتخاب دستی دیباگر در پیکربندی اشکال زدایی ، روی Run > Edit Configurations کلیک کنید. همچنین می‌توانید اشکال‌زدایی را در گفتگویی که با کلیک روی Run > Attach debugger to Android نمایش داده می‌شود، انتخاب کنید.

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

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

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

  • دستگاه از 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 را چاپ می کند.

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

در شکل 2، به دو زبانه سمت راست عنوان پنجره Debug توجه کنید. از آنجایی که برنامه دارای کد جاوا و C++ است، یک تب برای اشکال زدایی کد اصلی و دیگری برای اشکال زدایی کد جاوا است، همانطور که با -java نشان داده شده است.

شکل 3. تب برای اشکال زدایی کد بومی و تب برای اشکال زدایی کد جاوا.

توجه: هنگام اشکال زدایی کد بومی که توسط کامپایلر بهینه شده است، ممکن است پیام هشدار زیر را دریافت کنید:
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 */
        }
        ...
    }
}

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

کاتلین

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

جاوا

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

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

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

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

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

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

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

با نقاط شکست کار کنید

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

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

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

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

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

همانطور که در شکل 5 نشان داده شده است، هنگامی که نقطه شکست را تعیین می کنید، یک نقطه قرمز در کنار خط ظاهر می شود.

شکل 5. هنگامی که نقطه شکست را تعیین می کنید، یک نقطه قرمز در کنار خط ظاهر می شود.

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

برای شناسایی وضعیت برنامه، از ابزارهای موجود در تب Debugger استفاده کنید:

  • برای بررسی درخت شی برای یک متغیر، آن را در نمای Variables گسترش دهید. اگر نمای متغیرها قابل مشاهده نیست، روی Layout Settings کلیک کنید و اطمینان حاصل کنید که متغیرها بررسی شده اند.

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

  • برای رفتن به خط اول در یک فراخوانی متد، روی Step Into کلیک کنید .

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

  • برای ادامه اجرای نرمال برنامه، روی Resume Program کلیک کنید .

اگر پروژه شما از هر کد بومی استفاده می‌کند، به‌طور پیش‌فرض نوع Detect Automatically debug هم اشکال‌زدای جاوا و هم LLDB را به عنوان دو فرآیند جداگانه به برنامه‌تان متصل می‌کند. می‌توانید بدون راه‌اندازی مجدد برنامه یا تغییر تنظیمات، بین جاوا و C/C++ نقاط شکست جابه‌جا شوید.

توجه: برای اینکه Android Studio نقاط شکست را در کد C یا C++ شما شناسایی کند، باید از یک نوع اشکال زدایی استفاده کنید که از LLDB پشتیبانی می کند، مانند Detect Automatically، Native یا Dual. می‌توانید با ویرایش پیکربندی اشکال‌زدایی، نوع اشکال‌زدایی را که Android Studio استفاده می‌کند، تغییر دهید. برای کسب اطلاعات بیشتر در مورد انواع مختلف اشکال زدایی، بخش استفاده از انواع دیگر اشکال زدایی را مطالعه کنید.

همانطور که در شکل 6 نشان داده شده است، هنگامی که Android Studio برنامه شما را در دستگاه مورد نظر شما مستقر می کند، پنجره Debug با یک برگه یا نمای جلسه اشکال زدایی برای هر فرآیند دیباگر باز می شود.

شکل 6. اشکال زدایی کد بومی با استفاده از LLDB.
  1. زمانی که دیباگر LLDB با نقطه شکست کد C/C++ شما مواجه می‌شود، Android Studio به برگه <your-module> سوئیچ می‌کند. قاب‌ها، متغیرها و ساعت‌ها نیز در دسترس هستند و دقیقاً همانطور که اگر کد جاوا را اشکال زدایی می‌کردید کار می‌کنند.

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

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

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

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

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

برای مشاهده تمام نقاط شکست و پیکربندی تنظیمات نقطه شکست، روی View Breakpoints کلیک کنید در پنجره Debug. پنجره Breakpoints ظاهر می شود، همانطور که در شکل 7 نشان داده شده است.

شکل 7. پنجره Breakpoints تمام نقاط شکست فعلی را فهرست می کند و شامل تنظیمات رفتار برای هر یک می شود.

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

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

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

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

در پنجره Debugger، صفحه Frames به شما امکان می دهد قاب پشته ای را که باعث شده است نقطه شکست فعلی بررسی شود. این به شما امکان می دهد قاب پشته را پیمایش و بررسی کنید و همچنین لیست رشته ها را در برنامه اندروید خود بررسی کنید.

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

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

در پنجره Debugger، پنجره Variables به شما این امکان را می دهد که متغیرها را زمانی که سیستم برنامه شما را در نقطه شکست متوقف می کند و شما یک فریم را از پنجره Frames انتخاب می کنید، بررسی کنید. پنجره متغیرها همچنین به شما امکان می دهد عبارات موقت را با استفاده از روش های ثابت و/یا متغیرهای موجود در فریم انتخاب شده ارزیابی کنید.

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

شکل 8. درخت شی و جعبه ورود عبارت در پنجره Debug.
  1. عبارت را برای تماشا یا نمایش وارد کنید
  2. روی Add to watches کلیک کنید یا Enter را فشار دهید تا عبارت یک بار ارزیابی شود.

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

عبارات تماشا شده به‌روزرسانی می‌شوند زمانی که نقاط شکست وارد می‌شوند یا از کد خود عبور می‌کنید.

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

برای حذف عبارت تماشا شده از درخت شی، روی عبارت مورد نظر کلیک راست کرده و سپس روی Remove Watch کلیک کنید.

اضافه کردن نقاط مراقبت

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

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

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

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

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

توجه: هنگام اشکال زدایی برنامه خود با ARM ABI های 32 بیتی، افزودن نقطه نظارت یا نگه داشتن ماوس روی متغیرهای داخل کد برای بررسی مقادیر آنها ممکن است باعث خرابی شود. به عنوان یک راه حل، با استفاده از باینری های 64 بیتی ARM، x86 یا x86_64 اشکال زدایی کنید. این مشکل در نسخه بعدی اندروید استودیو برطرف خواهد شد.

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

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

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

    نقطه نظارت خود را با گزینه های زیر پیکربندی کنید:

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

برای مشاهده تمام نقاط مراقبت و پیکربندی تنظیمات نقطه نظارت، روی View Breakpoints کلیک کنید در پنجره Debug. همانطور که در شکل 10 نشان داده شده است، کادر گفتگوی نقاط شکست ظاهر می شود.

شکل 10. گفتگوی Breakpoints نقاط نظارت فعلی شما را فهرست می کند و شامل تنظیمات رفتار برای هر کدام می شود.

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

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

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

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

  1. در لیست متغیرها، در هر نقطه از خط منبع کلیک راست کنید تا لیست نمایش داده شود.
  2. در لیست، View as را انتخاب کنید و قالب مورد نظر خود را برای استفاده انتخاب کنید.

    فرمت های موجود به نوع داده منبعی که انتخاب کرده اید بستگی دارد. ممکن است یک یا چند گزینه زیر را مشاهده کنید:

    • Class: نمایش تعریف کلاس.
    • toString: نمایش فرمت رشته.
    • Object: تعریف شی (نمونه ای از یک کلاس) را نمایش می دهد.
    • آرایه: نمایش در قالب آرایه.
    • مهر زمان: تاریخ و زمان را به صورت زیر نمایش می دهد: yyyy-mm-dd hh:mm:ss.
    • خودکار: Android Studio بهترین قالب را بر اساس نوع داده انتخاب می کند.
    • باینری: یک مقدار باینری را با استفاده از صفر و یک نمایش می دهد.
    • MeasureSpec: مقداری که از والد به فرزند انتخاب شده منتقل می شود. به MeasureSpec مراجعه کنید.
    • Hex: نمایش به عنوان یک مقدار هگزادسیمال.
    • Primitive: نمایش به عنوان یک مقدار عددی با استفاده از یک نوع داده اولیه.
    • Integer: نمایش به عنوان یک مقدار عددی از نوع Integer .

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

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