Câu trả lời:
Đừng giả sử bất cứ điều gì
Nó thường hấp dẫn khi chỉ nói "ồ, tôi biết đoạn mã này đang làm gì, nó ổn". Đừng làm vậy. Kiểm tra mọi giả định và bước qua mọi thứ cẩn thận.
Kiểm tra tăng dần .
Trước tiên hãy đi sâu vào mã của bạn và kiểm tra nó từ mô-đun nhỏ nhất di chuyển dần lên. Theo cách này, bạn không phải chịu quá nhiều căng thẳng khi cố gắng tìm ra vấn đề chính xác có thể xảy ra.
Điều đó cũng có nghĩa là nó ảnh hưởng đến ít mã hơn tại một thời điểm vì bạn đang di chuyển tăng dần..những lúc tôi gặp vấn đề khi tôi sửa một cái gì đó và điều đó dẫn đến phá vỡ nhiều thứ khác. Tôi cung cấp tín dụng cho ông chủ của tôi cho điều này khi ông dạy tôi điều này khi tôi làm phiền.
Chia rẽ và chinh phục là một cách tiếp cận tốt. Cố gắng xác định một số đầu vào có thể nhìn thấy (đầu vào / sự kiện mạng của người dùng ...) và đầu ra (nhật ký, đầu ra cho người dùng, tin nhắn mạng bên ngoài ...) giữa vấn đề tồn tại. Hãy thử đặt các bản in ở các khối lớn hoặc các điểm quan trọng giữa chúng và cố gắng thu hẹp vị trí của lỗi trong mã.
Phân chia và chinh phục cũng có thể hoạt động rất tốt trong trường hợp hồi quy trên mã được kiểm soát phiên bản. Tìm hai bản dựng - một bản dựng ở đó hoạt động như mong đợi, bản kia có hồi quy. Thu hẹp khoảng cách xuống cho đến khi bạn bị bỏ lại với một loạt các checkin là nghi phạm tiềm năng.
Thay vì cắt lỗi nhị phân, hãy viết các bài kiểm tra theo mẫu
Để xác minh những gì bạn thực sự biết là đúng về chức năng của ứng dụng so với những gì bạn cho là đúng.
Hầu hết các IDE giúp dễ dàng trích xuất các phương thức và tạo ra các sơ đồ thử nghiệm xUnit. Hãy tận dụng điều đó.
Tại sao không rắc lỗi? Bởi vì sau khi bạn hoàn thành, bạn có thể sẽ phải hoàn tác phần lớn công việc đó và xóa một số lượng lớn các lỗi đó. Khi bạn viết bài kiểm tra, việc gỡ lỗi của bạn sẽ hỗ trợ ngăn ngừa và phát hiện các lỗi trong tương lai.
Như những người khác đã nói - đừng giả sử bất cứ điều gì. Điều này đặc biệt đúng nếu mã của nó bạn đã viết. Khi gỡ lỗi mã người khác, bạn có nhiều khả năng làm chậm vì mã này là mới đối với bạn hoặc bạn không tin tưởng vào người viết mã. Khi gỡ lỗi mã của riêng bạn, quá dễ để cho rằng bạn đã viết đúng, chậm lại!
Đối với quá trình gỡ lỗi thực tế:
Thêm các bài kiểm tra đơn vị và đăng nhập trước tiên hiệu quả hơn bằng cách sử dụng trình gỡ lỗi trước tiên. Bạn cũng có được lợi thế bổ sung khi có các bài kiểm tra đơn vị để giúp không giới thiệu các lỗi trong tương lai và việc ghi nhật ký sẽ giúp gỡ lỗi các phiên trong tương lai.
Trước khi bước qua một đoạn mã nhỏ, hãy xem bạn có thể xác định chính xác kết quả hay không. Điều này không có xu hướng bay lên khi không giả định bất cứ điều gì (mà tôi đã bình chọn BTW) nhưng khi bạn có kinh nghiệm, nó có thể giúp thu hẹp nơi để tìm.
Điều này nghe có vẻ tầm thường, nhưng tìm hiểu các sắc thái của trình gỡ lỗi của bạn và tìm hiểu các phím nóng. Đôi khi các trình sửa lỗi có thể đủ chậm để tâm trí bạn tự hỏi khi bước qua. Nếu bạn có thể theo kịp máy và không di chuyển xung quanh, điều đó có thể giúp ích.
Nếu bạn có thể sửa đổi mã trong khi gỡ lỗi:
như:
bool isLessThan5 = a < 5;
bool isGreaterThan10 = a > 10;
if ( isLessThan5 || isGreaterThan10 )
{
// more code here
}
thay vì:
if ( a < 5 || a > 10 )
{
// more code here
}
Đối với các trường hợp bạn không thể gỡ lỗi mọi thứ, vì bất kỳ lý do gì, hãy học cách "vịt cao su" với đồng nghiệp. Đôi khi hành động giải thích làm sáng tỏ. (ok, có lẽ điều này không chính xác trong chủ đề câu hỏi, nhưng tôi nghĩ nó đủ gần để đảm bảo đề cập)
Hai điều, dựa trên việc dành hầu hết 22 năm qua để duy trì mã người khác viết.
Hiểu các loại lỗi bạn có xu hướng viết.
Ví dụ, tôi là một lập trình viên rất tỉ mỉ, vì vậy một khi mã của tôi biên dịch, nó thường không có các lỗi nhỏ. Vì vậy, lỗi của tôi có xu hướng là những thứ phức tạp kỳ lạ như bế tắc chủ đề. Mặt khác, tôi có một người bạn chủ yếu viết các lỗi nhỏ - dấu chấm phẩy ở cuối C ++ cho các vòng lặp, vì vậy dòng tiếp theo chỉ được thực thi một lần, kiểu đó.
Đừng cho rằng người khác viết cùng loại lỗi bạn làm.
Tôi không biết mình đã lãng phí bao nhiêu thời gian để rút ra những khẩu súng gỡ lỗi lớn, cho rằng một lỗi là loại điều kỳ lạ thực sự tinh vi của tôi, chỉ để bạn tôi nhìn qua vai tôi và nói, "Bạn có để ý thêm không dấu chấm phẩy? " Sau nhiều năm, lần đầu tiên tôi đi tìm trái cây tầm thường, treo thấp khi nhìn vào mã của người khác.
Biết công cụ của bạn. Ví dụ: trình gỡ lỗi của Visual Studio có một tính năng tuyệt vời được gọi là TracePoints giống như các điểm dừng nhưng thay vì dừng mã của bạn thay vào đó lại chèn một câu lệnh theo dõi vào đầu ra gỡ lỗi.
Đọc sách hoặc tham gia một lớp học về cách sử dụng trình gỡ lỗi của bạn rất được khuyến khích. Tôi đã tham gia một vài lớp học và đọc một vài cuốn sách của John Robbins, điều này tạo ra sự khác biệt lớn trong hiệu quả của tôi với tư cách là một người sửa lỗi.
Viết kiểm tra đơn vị tự động và các loại tích hợp và kiểm tra chức năng khác.
Bạn càng có nhiều bài kiểm tra tự động, bạn càng cần ít thời gian hơn cho trình gỡ lỗi.
Ngoài ra, thiết kế tốt - nguyên tắc RẮN. Nếu bạn đang viết các lớp nhỏ, tập trung và ưu tiên sáng tác hơn kế thừa, loại bỏ trùng lặp, v.v., thì mã của bạn sẽ luôn dễ dàng hơn để gỡ lỗi.
Tôi thấy rằng mã được thiết kế tốt sẽ tạo ra một tập hợp các lỗi khác mà mã không được thiết kế tốt. Nói chung, mã được thiết kế tốt sẽ tạo ra các lỗi dễ tìm, tái tạo và sửa chữa hơn.
Ngoại lệ (và luôn có một) là mã đa luồng :-)
Hãy xem cuốn sách rất có giá trị Tại sao các chương trình thất bại: Hướng dẫn về gỡ lỗi có hệ thống , của Andreas Zeller. Nó sẽ giới thiệu cho bạn nhiều kỹ thuật, lý thuyết và công cụ, một số trong số đó là tiên tiến của nghiên cứu.
Các slide cho cuốn sách có sẵn trực tuyến, nhưng tôi thấy bản thân cuốn sách dễ đọc hơn.
Cuốn sách sẽ giúp bạn bắt đầu và khiến bạn suy nghĩ khoa học hơn về việc gỡ lỗi, nhưng nó không thay thế cho thực tiễn. Bạn có thể cần phải viết và gỡ lỗi trong 10 năm trước khi bạn thấy một thứ tự cải thiện cường độ trong hiệu suất của bạn. Tôi vẫn còn nhớ việc thả hàm của mình tại Sun khi thấy các nhà phát triển cấp cao, những người đã lập trình cho Unix trong 30 năm, tìm thấy các lỗi đa luồng hoặc song song tối nghĩa trong vài phút. Vấn đề kinh nghiệm!