اشکال زدایی (debug) برنامه
تماشای برخط [لینک مستقیم] فیلم آموزشی «اشکال زدایی برنامه»
زیر نویس انگلیسی [English Subtitle]
دریافت نسخهی pdf این آموزش [1.89 مگابایت]
تابحال تو دو تا از پست ها بهتون نشون داده شده که چجوری از DDMS برای مشاهده واقعی گزارشات ثبت شده (log) مربوط به برنامه که ناشی از دستگاهتون یا شبیهسازتونه، استفاده کنید. این کار بهتون کمک میکنه که بتونید خطاهای برنامهتونو رفع کنید یا فقط ببینید چه اتفاقی داره در حال اجرا مییفته.
در این مطلب میخوایم یه مقدار بیشتر به روشهای خطایابی های قدیمی بپردازیم.
1. اول یه پروژه جدید ایجاد کنید.
2. میریم سراغ فولدر res بعد layout ، فایل activity_main.xml رو باز میکنیم، از قسمت pallette یه TextViewو Button و EditText میکشیم میاریم رو صفحه. البته TextView معمولا به صورت پیش فرض هست(همون HelloWord).
و برنامه رو ذخیره میکنیم.
3. حالا اگر بخوایم برنامه مونو اشکال زدایی کنیم، باید یه چیزی به manifest اضافه کنیم که اجازه این کارو بهمون بده.
پس فایل Androidmanifest.xml رو باز میکنیم و رو زبانه Application کلیک میکنیم.
میتونیم مشخصهی debuggable رو همون بالا ببینیم. اگر بخوایم برنامهمونو به اشکال زدای ایکلیپس متصل کنیم، باید این مشخصه رو فعال(true) کنیم.
۴. میخوایم تو فایل جاوای برنامه مون اعلام کنیم که در صورت فشردن دکمه چیکار کنه. پس با این کد یه نمونه از دکمه میسازیم و به دکمهای که قبلا رو صفحه گذاشته بودیم متصل میکنیم.
Button dokme = (Button)findViewById(R.id.button1);
و بعد تابعی که قراره موقع کلیک دکمه صدا زده بشه رو میسازیم.
dokme.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } });
۵. روی DDMS کلیک کنید و LogCat رو ببینید. البته بدون رفتن تو DDMS هم میتونید LogCat رو ببینید، از منوی که پایین ایکلیپس قرار داره میتونید پیداش کنید. LogCat در واقع هر چیزی رو که تو دستگاه اندروید در حال وقوعه، گزارش میکنه. پس به ازای هر ضربه ای که به صفحه ی دستگاهتون میزنید، اگر کار خاصی انجام بدید، شروع میکنه به ساختن اطلاعات گزارشی. ولی ما میتونیم اطلاعاتی رو که خودمون درباره برنامهمون میخوایم هم اونجا قرار بدیم.
۶. پس به فایل جاوا برمیگردیم. اینجا از کلاس Log که تو بسته ی android.util هست، استفاده میکنیم.
تو این کلاس چندتا تابع وجود داره که میتونیم ازشون برای تهیه گزارش از هرچیزی تو LogCat استفاده کنیم. مثلا تابع d یه پیغام اشکال زدایی ارسال میکنه و ورودیهاش یه برچسب(tag) و یه پیغام(msg) هست. البته اگر بخوایم یه استثنایی رو هم گزارش کنیم، میتونیم یه شیء throwable رو به عنوان ورودی بهش بدیم.
همچنین تابع e رو داریم که برای گزارش استثناء بکار میره، تابع i یه پیغام اطلاعاتی و تابع v پیغام طولانی رو گزارش میکنه. w هم برای اخطاره. و اما جالب ترین چیزی که اینجا وجود داره، wtf هستش که مخفف اینه: What a Terrible Failure یعنی چه خرابی وحشتناکی و بیانگر چیزیه که انتظار نداشتیم تو سیستم اتفاق بیفته.
حالا ما میخوایم از تابع d استفاده کنیم. تو قسمت tag هر چیزی میتونه باشه، فقط باید یه جوری باشه که بتونیم از بین گزارشای دیگه توی LogCat تشخیصش بدیم. من اینجا با حروف بزرگ، سه بار مینویسم A. به عنوان پیغام هم اعلام میکنم که دکمه کلیک شده.
public void onClick(View v) { // TODO Auto-generated method stub Log.d("AAA", "dokme feshorde shode"); }
7. کاری که من میخوام انجام بدم اینه که یه نقطه توقف (break point) به قطعه کد بالا اضافه کنم، بطوریکه اجرای برنامه رو تو اون نقطه متوقف کنه و به ما اجازه اشکال زدایی (debug) بده. به ستونی که سمت چپ کدتون هست توجه کنید. روی اون ستون، دقیقا روبروی خط سوم، دوبار کلیک کنید تا یه break point ایجاد بشه. مطمئنا هر کدوم از شما که قبلا کدش رو دیباگ کرده، این کارو انجام داده.
و بعد اون علامت دیباگ بالای صفحه رو میزنیم.
و گزینه اول، یعنی Android Application رو انتخاب میکنیم.
۸. تو شبیهساز اول یه پیغام نشون میده مبنی بر اینکه منتظر اشکال زدا (Debugger) بوده.
در واقع منتظر اشکال زدای ایکلیپس بوده که به برنامهمون متصل شه. یه کمی صبر کنید متصل میشه.
وقتی رو دکمه ای که ساختیم کلیک کنیم، میبینیم که خودش ما رو میبره به قسمت debug توی ایکلیپس.
البته بسته به اینکه قبلا رو ایکلیپس چه کارایی انجام دادید، ممکنه یه پیغام نشون بده و ازتون بپرسه که آیا میخواید به قسمت اشکال زدا (debug) برید یا نه؟ که فقط کافیه بله رو بزنید.
۹. اگه یه نگاهی به logcat بندازید، متوجه میشید که پیغاممون رو گزارش نکرده. به خاطر اینکه برنامه مون رو تو اون نقطه متوقف کرده. پس رو علامت ادامه کلیک میکنیم تا اجرا ادامه پیدا کنه و اینجاست که میبینید پیغاممون گزارش میشه.
ستون Tag تو LogCat در واقع نشون دهندهی اینه که کدوم فرایند، یا کدوم برنامه این پیغام رو ارسال کرده.
۱۰. یه چیز دیگه که باید درمورد LogCat بهش توجه کنیم، اینه که مقدار عظیمی از اطلاعات رو، درمورد هر اتفاقی که تو دستگاه میافته، گزارش میکنه. ولی اگه بخوایم که فقط اطلاعات مربوط برنامه مون گزارش بشه چی؟
کاری که باید انجام بدیم اینه که یه فیلتر تنظیم کنیم. پس روی علامت که اون بالاست، کلیک میکنیم. و من اسم فیلترمو میذارم A و بهش میگم اون گزارش هایی رو نشون بده که با برچسب AAA علامت گذاری شدن.
و بعد مشاهده میکنید
11. همه این کارایی که انجام دادیم، یه روش قدیمی برای اشکال زدایی کد بود. و اما در مورد واسط کاربری، یه ابزار فوق العاده تو بسته ی SDK هست که این امکان رو برمون فراهم میکنه تا بتونیم مشکلات مربوط به صفحهبندیها (layout) و در واقع واسط کاربری بپردازیم.
بنابراین فعلا رو علامت کلیک میکنیم که ارتباط دیباگر قطع شه.
به محل نصب android sdk میریم یعنی پوشه ی android-sdk رو باز میکنیم و بعد به پوشه ی Toolsمیریم. ابزار مورد نظرمون یه batch فایله که اسمش هست hierarchyviewer. روش دوبار کلیک میکنیم. تو مک خودش برنامه رو از طریق command line باز میکنه.
hierarchy به معنی سلسله مراتبه. کاری که این ابزار انجام میده اینه که تمام فرایندها یا برنامه هایی رو که روی دستگاهمون در حال اجرا هستند، نمایش میده. الان دستگاهمون همون شبیهسازه.
12. برنامههای آمادهی اشکالزدایی تو hierarchyviewer نشون داده میشه. برنامهای میخوایم رو انتخاب میکنیم و بعد هم گزینه Load View Hierarchy رو میزنیم.
کاری که انجام میده اینه که میره و واسط کاربری برنامهمونو بررسی میکنه و اونو در قالب درختی نشون میده.
میتونیم تصویر رو بزرگ و کوچک کنیم و در واقع ساختار برنامه مون رو مشاهده کنیم.
الان ممکنه کنجکاو بشید که اون سه تا دایره ی رنگی چی هستن؟ در واقع برای نشون دادن performance یا همون سرعت عملکرده و سه مرحله هم واسش وجود داره. اولی اندازه گیری (measure) هستش که میزان فضای مورد نیاز رو اندازه میگیره. مرحله ی دوم صفحهبندی (layout) هستش که چیزایی که داریم رو صفحهبندی میکنه و مرحله ی سوم هم رسم کردن (draw) نام داره که طراحی رو روی صفحه رسم میکنه. و واضحه که اگر رنگ همه این دایره ها سبز باشه، بهتره، که اینم فقط به بقیه ی viewهای برنامه تون بستگی داره. ولی اگر رنگشون زرد یا قرمز باشه، خوب نیست (واضحه که قرمز بدترین حالت رو نشون میده) و شما باید این نقاط رو به خاطر بسپارید و مراقبشون باشید که خرابی به بار نیارن.
13. همه ما هنگام ساخت یه برنامه اندروید دوست داریم نمایی که از سلسله مراتب برنامه مون میبینیم،در ساده ترین شکل ممکن باقی بمونه و نمیخوایم که کلی صفحهبندیهای تو در تو داشته باشیم. حالا اگه رو مستطیل مربوط به دکمهمون کلیک کنیم، یه قاب باز میشه که کنترل دکمه اصلی توی اون قاب نمایانه.
همچنین میتونیم تو قسمت property که سمت راست قرار داره، همه اطلاعات مربوط به این دکمه، از جمله اندازه و مکان قرار گرفتن و ... رو با جزئیات کامل مشاهده کنیم.
14. این دفعه اگه رو مستطیل مربوط به دکمهمون دو بار کلیک کنیم، یه پیش نمایش ظاهر میشه که میتونیم بطور زنده توش ببینیم دکمه مون با پشت زمینه سیاه یا سفید چه شکلی میشه یا یه سری اطلاعات اضافهتری رو ببینیم.
بهتون پیشنهاد میکنم حتما hierarchyviewer رو باز کنید و سلسله مراتب طراحیتونو توش ببینید، چون این ابزار میتونه برای بهبود عملکرد برنامهتون خیلی مهم باشه.
15. ابزارهای دیگه ای هم وجود دارند که به همین خوبی هستند. این تصویر سایت SDK، زبانه ی Dev Guide، قسمت Debugging هستش. اگر شما واقعا به یه ردیابی عملکرد با جزئیات بالا برای برنامه تون نیاز دارید، یه ابزار به نام TraceView وجود داره که میتونه این کارو انجام بده. این ابزار حتی یه چیزی بیشتر از یه ابزار پیشرفتهست، به خاطر همینم ما فعلا خیلی بهش نمی پردازیم.
اما این ابزار یه نمایشی از یه نمودار زمانی بهتون میده که نشون میده کد شما تو کدوم زمان تو باریکه قرار گرفته. شما میتونید این کار رو با اضافه کردن یه سری اطلاعات مربوط به ردیابی، تو کدتون، انجام بدید.
تاکید میکنم که اگر شما با مشکلات اساسی تو برنامه تون روبرو میشید، یا دارید برنامه ای می نویسید که عملکرد خوب جز اولویتهای بالای اونه، TraceView ابزاریه که خیلی میتونه کمکتون کنه.
ببخشید وقتی تو قسمت کد نویسی ها کد مینویسیم و کدها خاکستری رنگ میشن و توی ران اجرا نمیشه برای چیه
میشه کمکم کنید