Hãy nói rằng chúng ta có một chức năng như thế này:
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;
}
Bây giờ vì lý do gì, mã của chúng tôi không hoạt động. Có lẽ đó là một lỗi, có lẽ nó trả về giá trị sai, có lẽ nó bị kẹt trong một vòng lặp vô hạn.
Điều đầu tiên mà bất kỳ lập trình viên năm đầu tiên, là in ra console / std out, (đã học cách in Hello World trước khi học cách sử dụng trình gỡ lỗi).
Ví dụ để gỡ lỗi mã này, họ có thể làm như sau:
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;
}
Bây giờ họ chạy mã, họ nhận được một giao diện điều khiển lớn được in ra, họ có thể đi qua để theo dõi nơi mà mọi thứ đang sai.
Tất nhiên, một cách khác là đặt các điểm dừng và chuyển qua mã tại mỗi điểm.
Một lợi thế lớn của việc in ra bàn điều khiển là nhà phát triển có thể thấy dòng chảy của các giá trị trong một lần mà không cần phải nhấp qua các bước, v.v.
Nhưng nhược điểm là, mã của bạn sau đó bị đánh đố với tất cả các câu lệnh in sau đó cần phải được loại bỏ.
(Có lẽ có thể yêu cầu trình gỡ lỗi chỉ in một số giá trị nhất định ra nhật ký?, Các điểm dừng sau đó có thể dễ dàng được thêm hoặc xóa mà không thực sự sửa đổi mã.)
Tôi vẫn sử dụng in giao diện điều khiển như một phương pháp gỡ lỗi chính, tôi tự hỏi mức độ phổ biến / hiệu quả của nó so với những thứ khác ngoài kia.