2017-02-08 65 views
5

Hmm ... Giáo viên của tôi, một số bạn cùng lớp của tôi và tôi sẽ xây dựng một dự án Debugger. Chúng tôi hy vọng rằng trình gỡ lỗi của chúng tôi tương tác, tức là khi mã được nhập, kết quả sẽ được hiển thị ở đâu đó vài giây sau đó và kết quả sẽ thay đổi trong khi mã đầu vào thay đổi. Mặt khác, trong khi chạy, chúng tôi có thể quay lại dòng cũ hoặc điểm ngắt.Nguyên tắc "Trình gỡ lỗi du hành thời gian" là gì?

Theo lời của giáo viên của tôi, kỹ thuật "Time Travel Debugging" sẽ được tham gia trong khi lập trình. Tôi đã tìm kiếm một số dự án được duy trì bởi những người khác nhưng tôi có thể không hiểu rõ mã và không có giới thiệu về kỹ thuật này trong bất kỳ tệp README nào.

tham khảo: https://github.com/mattgodbolt/compiler-explorer

+5

Giáo viên của bạn có phải là người hâm mộ của Tiến sĩ Ai không? "Thời gian du lịch biên dịch" không phải là một thuật ngữ tiêu chuẩn. Nó có vẻ giống như một cụm từ mà họ đặt ra. Bạn có thể hỏi họ ý nghĩa của nó. –

+0

Đó là về việc có thể thiết lập một điểm ngắt trong trình gỡ rối và sau đó bước * lùi * thông qua các câu lệnh để xem trạng thái của môi trường thời gian chạy tại các điểm * trước * điểm ngắt. – Pointy

+0

Và nó không thực sự có nhiều thứ để làm với * trình biên dịch *, thực sự; đó là một điều hệ thống thời gian chạy. Vâng, tôi đoán * một trình biên dịch có thể tạo mã để duy trì một số loại ngữ cảnh kiểm toán, nhưng điều đó có vẻ giống như một cách thực sự kỳ lạ khi làm việc. – Pointy

Trả lời

6

này thường được gọi là "gỡ lỗi thời gian đi lại", và thường gắn liền với "Lập trình phản ứng chức năng". Có một số tài liệu có thể truy cập hợp lý trên blog Elm Language (ví dụ: time travel made easy), nhưng tôi khuyên bạn nên bắt đầu ngay từ đầu thay vì lặn vào giữa và phải đi lại thời gian Sự hiểu biết (một số ý định chơi chữ :-))

Nói đúng, gỡ lỗi thời gian là điều gì đó xảy ra trong thời gian chạy, nhưng dễ dàng hơn nhiều nếu bạn lập trình bằng ngôn ngữ chức năng (chẳng hạn như Haskell, Elm, OCAML, hoặc những người khác, trong đó các trình gỡ rối du hành thời gian đã được triển khai) và biên dịch các ngôn ngữ này (có, chúng được biên dịch) liên quan đến một số khái niệm thú vị.

Elm biên dịch sang javascript, điều này khiến việc thử nghiệm tương đối dễ dàng.

Vui chơi với dự án.

+0

AFAIK nó có thể được sử dụng với tất cả các chương trình chức năng thuần túy, tại sao bạn giới hạn nó chỉ hoạt động phản ứng? –

+0

@Guy: Tôi thì không. Trong thực tế, nó có thể được sử dụng với lập trình phi chức năng là tốt; có một trình gỡ lỗi thời gian đi cho javascript, đó là decidedly không phải là một ngôn ngữ lập trình chức năng. Những gì tôi nói là nó thường được liên kết với FRP, được dự định để cung cấp cho một số gợi ý cho OP để tìm kiếm thêm thông tin. Tôi đã thêm OCAML vào danh sách các ngôn ngữ chức năng trong đoạn thứ hai. – rici

+0

Bạn cũng có thể muốn đề cập đến, [Visual Studio IntelliTrace] (https://msdn.microsoft.com/en-us/library/dd264915.aspx) –

1

Thời gian đi gỡ lỗi còn được gọi là gỡ lỗi ngược. Trong các thuật ngữ layman, bạn có thể gỡ rối các dòng giống nhau một lần nữa và một lần nữa (không dừng/khởi động lại ứng dụng). Ví dụ, bạn đang gỡ lỗi một phương thức đã ném một ngoại lệ ở dòng 10, để tìm nguyên nhân ngoại lệ, bạn có thể thực hiện lại phương thức đó từ điểm trước, giả sử dòng 4 mà không cần khởi động lại quá trình gỡ lỗi hoàn chỉnh. đó là tất cả thời gian thực và khá hiệu quả.

Tôi đã sử dụng tính năng này trong Visual Studio.

Các vấn đề liên quan