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

اندروید استودیو یک اشکال‌زدا (دیباگر) ارائه می‌دهد که به شما امکان می‌دهد موارد زیر و موارد دیگر را انجام دهید:

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

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

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

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

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

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

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

گرووی

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

کاتلین

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

این ویژگی همچنین در مورد ماژول‌هایی با کد C/C++ صدق می‌کند.

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

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

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

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

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

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

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

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

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

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

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

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

  1. روی «اتصال اشکال‌زدا به فرآیند اندروید» کلیک کنید .
  2. در پنجره‌ی «انتخاب فرآیند» ، فرآیندی را که می‌خواهید اشکال‌زدا را به آن متصل کنید، انتخاب کنید.
    1. اگر از یک شبیه‌ساز یا یک دستگاه روت‌شده استفاده می‌کنید، می‌توانید برای مشاهده‌ی تمام فرآیندها، گزینه‌ی «نمایش تمام فرآیندها» را تیک بزنید. در یک دستگاه روت‌شده، این گزینه تمام فرآیندهای در حال اجرا روی دستگاه را نشان می‌دهد. با این حال، در یک دستگاه روت‌نشده، این گزینه فقط فرآیندهای قابل اشکال‌زدایی را نشان می‌دهد.
    2. از منوی «استفاده از تنظیمات اشکال‌زدای اندروید از »، می‌توانید پیکربندی اجرا/اشکال‌زدایی موجود را انتخاب کنید. برای کد C و C++، این به شما امکان می‌دهد از دستورات راه‌اندازی LLDB، دستورات پس از اتصال LLDB و دایرکتوری‌های نماد در یک پیکربندی موجود، دوباره استفاده کنید.
    3. اگر پیکربندی اجرا/اشکال‌زدایی موجود ندارید، گزینه ایجاد جدید (Create New) را انتخاب کنید. این انتخاب، منوی Debug Type را فعال می‌کند، جایی که می‌توانید نوع اشکال‌زدایی متفاوتی را انتخاب کنید . به‌طور پیش‌فرض، اندروید استودیو از نوع اشکال‌زدایی Detect Automatically برای انتخاب بهترین گزینه اشکال‌زدایی برای شما، بر اساس اینکه پروژه شما شامل کد جاوا یا C/C++ است، استفاده می‌کند.
  3. روی تأیید کلیک کنید.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    run-as your-package-name pwd
    

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

  • دستگاه دارای قابلیت ptrace است.

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

    sysctl kernel.yama.ptrace_scope
    

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

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

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

شکل ۳. تب مربوط به اشکال‌زدایی کد بومی و تب مربوط به اشکال‌زدایی کد جاوا.

نکته: هنگام اشکال‌زدایی کد native که توسط کامپایلر بهینه‌سازی شده است، ممکن است پیام هشدار زیر را دریافت کنید:
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 مشاهده و فیلتر کنید. برای مثال، می‌توانید پیام‌هایی را که هنگام انجام عملیات جمع‌آوری زباله (garbage collection) رخ می‌دهد یا پیام‌هایی را که با کلاس Log به برنامه خود اضافه می‌کنید، مشاهده کنید.

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

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

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

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

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

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

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

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

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

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

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

وقتی اجرای کد شما به نقطه توقف (breakpoint) می‌رسد، اندروید استودیو اجرای برنامه شما را متوقف می‌کند.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

در پنجره‌ی اشکال‌زدا (Debugger)، بخش متغیرها (Variables) به شما امکان می‌دهد وقتی سیستم برنامه‌ی شما را در یک نقطه‌ی توقف متوقف می‌کند و شما یک فریم از بخش فریم‌ها را انتخاب می‌کنید، متغیرها را بررسی کنید. بخش متغیرها همچنین به شما امکان می‌دهد عبارات موقت (ad hoc expressions) را با استفاده از متدهای استاتیک و/یا متغیرهای موجود در فریم انتخاب شده ارزیابی کنید.

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

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

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

عبارات تحت نظارت، زمانی که به نقاط توقف (breakpoints) برخورد می‌کنید یا کد خود را به صورت مرحله‌ای بررسی می‌کنید، به‌روزرسانی می‌شوند.

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

برای حذف یک عبارت مشاهده‌شده از درخت اشیاء، روی عبارت کلیک راست کرده و سپس روی «حذف مشاهده» کلیک کنید.

نقاط دیده‌بانی را اضافه کنید

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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