مترجم: حبیب الله علیخانی
منبع:راسخون
منبع:راسخون
دیباگ یا اشکال زدایی
توسعه دهنده ها از روش های مختلفی برای دیباگ استفاده می کننددر ابتدا برنامه نویسان جاوا کد هایی مانند زیر می نوشتند :
public class BadDebugExample {
public static void main(String[] args)
{
System.out.println("1");
Calculator calc = new Calculator();
System.out.println("2");
String results = calc.doCalculation(4);
System.out.println("3");
String results2 = calc.doCalculation(5);
System.out.println("4");
String results3 = calc.doCalculation(6);
}
}
با اضافه کردن System.out.println در کد قبل ، یک روش زمخت برای trace برنامه بود ، اما netbeans راه های آسانتری به نام debugging tools ارائه کرد .
دیباگ کد های جاوا در IDE شامل مراحل خط به خط میان کد های برنامه است.شما می توانید اجرای برنامه را در خطوط خاصی ( breakpoint ها) متوقف کنید یا مقادیر متغییر ها و اشیا را ببینید.
بعضی از فعالیت هایی که دیباگ IDE انجام می دهد شامل زیر می باشد :
1- متوقف کردن برنامه در خط خاص
2- اجرای یک خط
3- پرش از روی یک خط از کدی که نمی خواهیم اجرا شود
4- اجرای برنامه تا زمانی که به جایی که مکان نما(cursor) قرار گرفته
5- دیدن پشته ی فراخوانی تا خط خاص
6- دیدن متغییر محلی
7- دیدن مقدار متغییر کلاس
8- ارزیابی مقدار بازگشتی یک متد بدون اینکه داخل آن برود
9- Trace کردن برنامه در طول نخ های چندگانه
10- توقف اجرای برنامه با شرط روی یک خط خاص
11- تغییر مقدار متغییر ها زمان اجرا برای دیدن اینکه چه تاثیری روی برنامه دارد.
Breakpoints
Breakpoint یک مفهوم مهم در دیباگ است و علامت ها و نشانه هایی را در جایی که می خواهیم اجرای برنامه متوقف شود قرار می دهد. برای دیباگ باید حد اقل یک breakpoint داشته باشید.با چند روش می توان آن را در کد قرار داد.
ایجاد Breakpoint
1- برای ایجاد breakpoint روی روی نوار سمت چپ یعنی جایی که شماره خط وجود دارد کلیک می کنیم و یک خط صورتی رنگ طولانی ایجاد می شود.2- راه دیگری برای اضافه کردن breakpoint وجود دارد. ابتدا خطی را که می خواهیم breakpoint قرار دهیم را
انتخاب می کنیم و سپس مسیر روبرو : > Toggle Line Breakpoint Debug
3- راه دیگری برای اضافه کردن breakpoint نوعی متفاوت وجود دارد که می توانیم class breakpoint اضافه کنیم
این روش اجازه می دهد که اجرای برنامه را زمانیکه کلاسی از ماشین مجازی جاوا load یا unload می شود متوقف کند.
از مسیر روبرو: Debug > New Breakpoint
در قسمت Breakpoint Type ، Class را انتخاب می کنیم
در قسمت Stop on :
Class Load : اجرای برنامه را وقتی که کلاس مورد نظر به JVM (ماشین مجازی جاوا ) load می شود ، متوقف می کند.
Class Unload : اجرای برنامه را وقتی که کلاس مورد نظر از JVM (ماشین مجازی جاوا ) unload می شود، متوقف می کند.
Class Load or Unload : اجرای برنامه را وقتی که کلاس مورد نظر به JVM ، load یا از JVM ، unload می شود ، متوقف می کند.
قسمت Condition به شما اجازه می دهد که یک یا چند کلاسی را استثنا بگیرید. و در پایین می توانید تعداد break را اختصاص دهید.
بخش Actions قسمتی است که تعیین می کند که هنگامی که به breakpoint می رسد چه اتفاقی بیافتد.
حذف Breakpoint
برای حذف breakpoint روی آن کلیک کرده و آن را ناپدید می کنیم.غیر فعال کردن Breakpoint
در شکل زیر تیک نشان داده شده را بر می داریم:و رنگ آن خاکستری می شود.
Debugging دیباگ یک پروژه
برای دیباگ باید حد اقل یک breakpoint داشته باشید.وقتی که اولین بار اجرای برنامه متوقف می شود ، شما می توانید از طریق آپشن های زیر برنامه را trace کنید:
Step Over : یک خط از کد را اجرا می کند. اگر این خط فراخوانی یک تابع باشد، تابع را بدون اینکه به داخل تابع برود اجرا می کند
Step Into : یک خط از کد را اجرا می کند. اگر این خط فراخوانی یک تابع باشد، به داخل تابع می رود و در اولین خط آن متوقف می شود.
Step out : یک خط از کد را اجرا می کند. اگر آن خط داخل یک تابع باشد، باقیمانده کد تابع را اجرا می کند مقدار بازگشتی فراخوانی تابع را برمی گرداند.
Run To Cursor : خطی که مکان نما در آن قرار دارد را اجرا می کند.
Continue : اجرای برنامه را تا رسیدن به Breakpoint بعدی یا اتمام برنامه ادامه می دهد.
ابتدا اگر پنجره output در پایین باز نباشد از مسیر روبرو آنرا باز می کنیم Window > Outpu t > Output
IDE کد را کامپایل می کند و چند پنجره دیباگ باز می کند، مانند : Debugging و Debugging Console مانند شکل زیر:
ایکن سبز می شود و قابل کلیک کردن است، این آیکن شما را به دیباگ قبلی بر می گرداند. تب Debugging Console شامل خروجی های استاندارد است
روش های مختلفی برای دیباگ در netbeans وجود دارد.
1- روش اول: از منوی Debug :
اگر Main Projectپروژه اصلی نداشته باشد،(Ctrl+F5 ) project Debug > Debug
2- اگر بخواهیم یک فایل کلاس را (بدون اینکه کل پروژه را دیباگ کنیم) دیباگ کنیم ، گزینه زیر را انتخاب می کنیم:
کللاسی که انتخاب می کنید باید main داشته باشد وگرنه پیغام زیر را می دهد:
اگر در چند پروژه داشته باشید و یکی از پروژه ها را به عنوان پروژه اصلی main project در نظر بگیرید ، یعنی هنگام ساخت یکی از پروژه ها، گزینه ی set as main project را تیک زده باشید
در پنجره project یکی از آنها پر رنگ تر می شود ( بدیهی است که فقط یک پروژه می تواند main project باشد)
یا روی آن کلیک کرده و آن را main project در نظر می گیریم :
اگر بخواهیم پروژه ای که main project است را دیباگ کنیم ، نیاز به انتخاب آن نیست و کافی است :
(Ctrl+F5 ) Main project Debug > Debug
این روش برنامه را اجرا می کند تا به اولین breakpoint برسد . می توانید از طریق آپشن های گفته شده در بالا برنامه را trace کنید. اگر breakpoint ای نداشته باشیم، برنامه run می شود تا به پایان برسد.
2- روش دوم : از مسیر روبرو: Debug > Run To Cursor
مثال : کلاس calculator را بسازید و کد های زیر را در آن وارد کنید و در خط 11 یک breakpoint قرار دهید:
برای متوقف کردن و پایان کار دیباگ از یکی دو مسیر زیر می رویم:
3- روش سوم : از مسیر روبرو: Debug > Step Into
وقتی به صورت عادی دیباگ می کنیم ، این گزینه را در toolbar هم داریم. ( )
روش دیگر این است که یک watch روی متغییر قرار دهید.
4- پنجره watch
این پنجره همه ی متغیییر ها و عباراتی که شما هنگام دیباگ کردن مشخص می کنید لیست می کند. به عنوان پیش فرض این پنجره به طور اتوماتیک از جایی که شروع به دیباگ می کنید باز می شود. یا می توانید از مسیر زیر آن را فعال کنید : Debugging > Watches window >وقتی که مقدار جدیدی به watch اضافه کنید، ارزش متغییر سریع تغییر می کندو نشان داده می شود. مقدار یک watch به متن جاری بستگی دارد.هنگامیکه شما از میان کد برنامه حرکت می کنید پنجره watch به روز رسانی می شود.در بعضی موارد، دیباگ کننده علامت پوند(#) و یک شماره را به عنوان مقدار متغییر اختصاص می دهد. این شماره یک معرف یکتا نمونه معیین است . اگریک نمونه مشابه یا متفاوت نشان دهد شما می توانید این معرف را برای تعیین کردن استفاده کنید. شما نمی توانید این مقداررا تغییر دهید.
جدول زیر ایکون هایی که در سمت چپ نام اشیا نشان داده می شود را توصیف می کند:
کد های زیر را در ادیتور خود وارد کنید:
New Watch را انتخاب می کنیم (ctrl+shift+f7) و یک dialog box جدید باز می شود که مقداری در text fild آن وجود دارد
2- Ok می کنیم.
اگر پنجره watch فعال نباشد از مسیر زیر آنرا فعال می کنیم:
این پنجره نام ، نوع و مقدار همه ی مقادیر در محدوده جاری و همچنین متغییر های استاتیک از بقیه را نشان می دهد.
برای فعال کردن این پنجره از مسیر روبرو: windows > Debugging > Variables
دیباگ کننده به شما اجازه می دهد که مقادیر متغییر ها را در این پنجره تغییر دهید و اجرا برنامه را با استفاده از مقادیر جدید ادامه دهید.
کلاسی به نام (person.java) ایجاد می کنیم و کد های سیر را در آن وارد می کنیم.
یک watch ساده اصافه می کنیم و پنجره ی variables را بررسی می کنیم:
1- در کلاس person.java متغییر personal را انتخاب می کنیم.
2- دو روش برای افزودن watch وجود دارد یکی با نوار بالا و مسیر Debug> new watch یا با فشردن (ctrl+shift+f7) ، بعد ok می کنیم و personal به variable view اضافه می شود.
person2.setName(null);
this.age = age;
به محض اینکه دیباگ شروع شود اجرا در اولین breakpoint متوقف می شود.
Break point به IDE می گوید که موقتا برنامه را متوقف کندو به توسعه دهنده (برنامه نویس) اجازه دهد تا مقادیر متغییرها و watch را در آن نقطه آزمایش کند.
نقطه اجرا با رنگ سبز هایلایت شده. برای پرش به خطی از کد F8 را می زنیم. برای ادامه F5 را می زنیم. IDE عملیات دیباگ را تا پیدا کردن breakpoint دیگر ادامه می دهد، در نقطه ای که اجرا متوقف می شود، توسعه دهنده (برنامه نویس) شانس دیگری برای آزمودن اجرا دارد.
در مثال ما اجرا تا تابع person2.setAge ادامه پیدا می کند. اگرbreakpoint دیگری نداشته باشیم اجرای برنامه تا اخر ادامه پیدا می کند.
breakpoint شرطی
می توانیم breakpoint شرطی ایجاد کنیم،
> properties > Breakpoint < کلیک راس روی breakpoint
/ج