สมมติว่าเรามีฟังก์ชั่นเช่นนี้:
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;
}
ตอนนี้ไม่ว่าด้วยเหตุผลใดรหัสของเราไม่ทำงาน บางทีมันกำลังโยนข้อผิดพลาดบางทีมันอาจจะคืนค่าผิดบางทีก็ติดอยู่ในวงวนไม่สิ้นสุด
สิ่งแรกที่โปรแกรมเมอร์คนแรกในปีแรกคือพิมพ์ไปที่ console / std out (เรียนรู้วิธีพิมพ์ Hello World ก่อนที่จะเรียนรู้การใช้ดีบักเกอร์)
ตัวอย่างเช่นการดีบักรหัสนี้พวกเขาอาจทำสิ่งต่อไปนี้:
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;
}
ตอนนี้พวกเขาเรียกใช้รหัสพวกเขาได้รับการพิมพ์คอนโซลขนาดใหญ่ซึ่งพวกเขาสามารถผ่านการติดตามในสิ่งที่ผิดพลาด
อีกทางเลือกหนึ่งของหลักสูตรคือการกำหนดจุดพักและขั้นตอนผ่านรหัสในแต่ละจุด
ข้อได้เปรียบที่สำคัญอย่างหนึ่งของการพิมพ์ไปยังคอนโซลคือผู้พัฒนาสามารถเห็นการไหลของค่าในครั้งเดียวโดยไม่ต้องคลิกผ่านขั้นตอนอื่น ๆ
แต่ข้อเสียคือรหัสของคุณจะเต็มไปด้วยงบการพิมพ์เหล่านี้ที่จะต้องถูกลบออก
(เป็นไปได้ไหมที่จะบอกให้ดีบักพิมพ์เฉพาะค่าบางอย่างออกไปยังบันทึกหรือไม่จุดพักสามารถเพิ่มหรือเอาออกได้อย่างง่ายดายโดยไม่ต้องแก้ไขรหัส)
ฉันยังคงใช้การพิมพ์คอนโซลเป็นวิธีการตรวจแก้จุดบกพร่องหลักฉันสงสัยว่านี่เป็นเรื่องธรรมดา / มีประสิทธิภาพเมื่อเทียบกับสิ่งอื่นที่มีอยู่