Tôi muốn nói thêm rằng trình gỡ lỗi không phải lúc nào cũng là giải pháp hoàn hảo và không phải lúc nào cũng là giải pháp phù hợp để gỡ lỗi. Dưới đây là một số trường hợp trình gỡ lỗi có thể không hoạt động với bạn:
- Phần chương trình của bạn bị lỗi thực sự rất lớn (có thể là mô-đun hóa kém?) Và bạn không chắc chắn chính xác nơi bắt đầu bước qua mã. Bước qua tất cả các bước có thể quá tốn thời gian.
- Chương trình của bạn sử dụng rất nhiều lệnh gọi lại và các phương pháp điều khiển luồng phi tuyến tính khác, điều này làm cho trình gỡ lỗi bị nhầm lẫn khi bạn bước qua nó.
- Chương trình của bạn là đa luồng. Hoặc thậm chí tệ hơn, vấn đề của bạn là do tình trạng chủng tộc.
- Mã có lỗi sẽ chạy nhiều lần trước khi lỗi. Điều này có thể đặc biệt có vấn đề trong các vòng lặp chính, hoặc tệ hơn là trong các động cơ vật lý, nơi mà vấn đề có thể là số. Ngay cả việc thiết lập một điểm ngắt, trong trường hợp này, đơn giản là bạn sẽ đánh nó nhiều lần, với lỗi không xuất hiện.
- Chương trình của bạn phải chạy trong thời gian thực. Đây là một vấn đề lớn đối với các chương trình kết nối với mạng. Nếu bạn thiết lập một điểm ngắt trong mã mạng của mình, đầu kia sẽ không đợi bạn bước qua mà chỉ đơn giản là hết thời gian. Các chương trình dựa vào đồng hồ hệ thống, ví dụ như trò chơi với khung hình, cũng không tốt hơn nhiều.
- Chương trình của bạn thực hiện một số dạng hành động phá hoại, chẳng hạn như ghi vào tệp hoặc gửi e-mail và bạn muốn giới hạn số lần bạn cần chạy qua nó.
- Bạn có thể nói rằng lỗi của bạn là do các giá trị đến hàm X không chính xác, nhưng bạn không biết các giá trị này đến từ đâu. Việc phải chạy đi chạy lại chương trình, đặt các điểm ngắt ngày càng xa, có thể là một rắc rối lớn. Đặc biệt nếu hàm X được gọi từ nhiều nơi trong suốt chương trình.
Trong tất cả các trường hợp này, việc chương trình của bạn dừng đột ngột có thể khiến kết quả cuối cùng khác nhau hoặc thực hiện theo cách thủ công để tìm kiếm một dòng mà lỗi gây ra quá phức tạp. Điều này có thể xảy ra như nhau cho dù lỗi của bạn là hành vi không chính xác hoặc sự cố. Ví dụ: nếu hỏng bộ nhớ gây ra sự cố, vào thời điểm sự cố xảy ra, nó quá xa so với nơi xảy ra lỗi bộ nhớ đầu tiên và không còn thông tin hữu ích nào.
Vì vậy, các lựa chọn thay thế là gì?
Đơn giản nhất chỉ đơn giản là ghi nhật ký và xác nhận. Thêm nhật ký vào chương trình của bạn ở nhiều điểm khác nhau và so sánh những gì bạn nhận được với những gì bạn đang mong đợi. Ví dụ, hãy xem liệu chức năng mà bạn cho rằng có lỗi có được gọi ngay từ đầu hay không. Xem liệu các biến ở đầu một phương pháp có đúng như bạn nghĩ không. Không giống như các điểm ngắt, không sao cả khi có nhiều dòng nhật ký trong đó không có gì đặc biệt xảy ra. Bạn có thể chỉ cần tìm kiếm thông qua nhật ký sau đó. Khi bạn đạt đến một dòng nhật ký khác với những gì bạn đang mong đợi, hãy thêm nhiều dòng khác vào cùng một khu vực. Thu hẹp nó ngày càng xa, cho đến khi nó đủ nhỏ để có thể ghi lại mọi dòng trong khu vực bị nghe trộm.
Các xác nhận có thể được sử dụng để bẫy các giá trị không chính xác khi chúng xảy ra, thay vì một khi chúng có tác dụng hiển thị cho người dùng cuối. Bạn bắt được một giá trị không chính xác càng nhanh, bạn càng gần với dòng tạo ra nó.
Refactor và kiểm thử đơn vị. Nếu chương trình của bạn quá lớn, bạn nên kiểm tra một lớp hoặc một hàm tại một thời điểm. Cung cấp cho nó đầu vào, và xem xét đầu ra, và xem cái nào không như bạn mong đợi. Khả năng thu hẹp một lỗi từ toàn bộ chương trình thành một chức năng duy nhất có thể tạo ra sự khác biệt lớn về thời gian gỡ lỗi.
Trong trường hợp bộ nhớ bị rò rỉ hoặc bộ nhớ ngừng hoạt động, hãy sử dụng các công cụ thích hợp có khả năng phân tích và phát hiện chúng trong thời gian chạy. Bước đầu tiên có thể phát hiện ra nơi tham nhũng thực sự xảy ra. Sau đó, bạn có thể sử dụng nhật ký để quay lại nơi các giá trị không chính xác được đưa vào.
Hãy nhớ rằng gỡ lỗi là một quá trình đi ngược lại. Bạn có kết quả cuối cùng - một lỗi - và tìm nguyên nhân, dẫn đến nó. Đó là làm việc theo cách của bạn lùi lại và, thật không may, trình gỡ lỗi chỉ bước về phía trước. Đây là nơi mà việc ghi nhật ký tốt và phân tích sau khám nghiệm có thể cho bạn kết quả tốt hơn nhiều.