मान लीजिए कि हमारे पास एक फंक्शन है:
public void myStart()
{
for (int i = 0; i<10; i++) myFunction(i);
}
private int myFunction(int a)
{
a = foo(a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
//something gnarly here
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
अब जो भी कारण हो, हमारा कोड काम नहीं कर रहा है। शायद यह एक त्रुटि फेंक रहा है, शायद यह गलत मान लौटा रहा है, शायद यह एक अनंत लूप में फंस गया है।
पहली बात यह है कि किसी भी प्रथम वर्ष के प्रोग्रामर, कंसोल / एसटीडी से प्रिंट आउट है, (डिबगर का उपयोग करना सीखने से पहले हैलो वर्ल्ड को प्रिंट करना सीखें)।
उदाहरण के लिए इस कोड को डीबग करने के लिए वे निम्नलिखित कार्य कर सकते हैं:
private int myFunction(int a)
{
print("before foo: a=" + a);
a = foo(a);
print("before bar: a=" + a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
print ("foo step1: a=" + a);
//something gnarly here
print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length());
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
अब वे कोड चलाते हैं, उन्हें एक बड़ा कंसोल प्रिंट आउट मिलता है, जिसे वे ट्रेस कर सकते हैं जहां चीजें गलत हो रही हैं।
पाठ्यक्रम का एक विकल्प, प्रत्येक बिंदु पर कोड के माध्यम से ब्रेकपॉइंट सेट करना और चरणबद्ध करना है।
कंसोल को प्रिंट करने का एक प्रमुख लाभ यह है कि डेवलपर एक चरण में मानों के प्रवाह को देख सकता है, बिना चरणों आदि पर क्लिक किए।
लेकिन नुकसान यह है कि आपके कोड को इन सभी प्रिंट स्टेटमेंट के साथ फिर से जोड़ दिया जाता है, जिसे फिर हटाने की आवश्यकता होती है।
(क्या यह संभव है कि डिबगर को केवल कुछ मानों को एक लॉग में प्रिंट करने के लिए कहा जाए ?, ब्रेकपॉइंट्स को आसानी से जोड़ा जा सकता है या वास्तव में कोड को संशोधित किए बिना हटाया जा सकता है।)
मैं अभी भी एक प्राथमिक डीबगिंग विधि के रूप में कंसोल प्रिंटिंग का उपयोग करता हूं, मैं सोच रहा हूं कि यह किसी अन्य चीज की तुलना में कितना सामान्य / प्रभावी है।