2014-09-22 15 views
29

Sau khi tôi nhấn n để đánh giá một dòng, tôi muốn quay lại và sau đó nhấn s để bước vào hàm đó nếu nó không thành công. Điều này có thể không?Có thể bước lùi trong pdb không?

Các tài liệu nói:

j (UMP) lineno Đặt dòng tiếp theo sẽ được thực thi. Chỉ khả dụng ở khung dưới cùng. Điều này cho phép bạn quay lại và thực thi lại mã hoặc nhảy về phía trước để bỏ qua mã mà bạn không muốn chạy.

+4

Không. PDB không thể quay ngược thời gian. –

+0

@MartijnPieters xem chỉnh sửa của tôi, tài liệu cho biết bạn có thể quay lại một dòng, vì vậy không thể thực hiện việc này hoặc chuyển về dòng trước bằng cách nào đó? – YPCrumble

+0

Nhảy trở lại chức năng không thành công và khôi phục trạng thái gây ra lỗi là hai thứ khác nhau. –

Trả lời

22

Trình gỡ lỗi GNU, gdb: Nó cực kỳ chậm, vì nó hủy bỏ lệnh máy đơn tại một thời điểm.

Trình gỡ lỗi Python, pdb: Lệnh jump sẽ đưa bạn lùi trong mã, nhưng không đảo ngược trạng thái của chương trình.

Đối với Python, nguyên mẫu trình gỡ lỗi python mở rộng, epdb, được tạo ra vì lý do này. Đây là số thesis và đây là số program and the code.

Tôi đã sử dụng epdb làm điểm bắt đầu để tạo trình gỡ lỗi đảo ngược trực tiếp như một phần của bằng thạc sĩ của tôi. Luận án có sẵn trực tuyến: Combining reverse debugging and live programming towards visual thinking in computer programming. Trong chương 1 và 2, tôi cũng trình bày hầu hết các phương pháp lịch sử để đảo ngược gỡ lỗi.

+0

Luận án có vẻ rất tốt! Tôi chưa đọc chi tiết, nhưng khi bạn là chuyên gia: bạn nghĩ gì về các giải pháp được đề cập ở câu hỏi này? Epdb của bạn vs [timetravelpdb] (https://github.com/TomOnTime/timetravelpdb) vs [revdb trong PyPy] (https://morepypy.blogspot.com.au/2016/07/reverse-debugging-for-python. html)? – ShreevatsaR

+1

@ShreevatsaR Không chắc bạn đang đề cập đến luận án nào, luận án epdb trước của Patrick Sabin, hay luận án sau của tôi, cả hai đều được liên kết ở trên. Đã không theo dõi sự phát triển gỡ lỗi ngược trong hơn 2 năm nên không chắc chắn. Sau khi lướt qua nhanh: timetravelpdb có vẻ rất giống với epdb, nhưng có ít tính năng hơn, ví dụ: epdb quản lý không chỉ trạng thái chương trình mà là trạng thái bên ngoài/môi trường (ở một mức độ nào đó), để đảm bảo tính xác định. Revdb sử dụng cách tiếp cận bản ghi phát lại, dường như cũng không quản lý trạng thái bên ngoài. Cả hai phương pháp tiếp cận bản ghi và replshotting (sở thích của tôi) đều có giá trị, như được giải thích trong luận án của tôi. – Abraham

+0

Cảm ơn! Điều đó rất hữu ích. – ShreevatsaR

9

Gỡ lỗi ngược (quay lại trạng thái ứng dụng đã ghi trước đó hoặc gỡ lỗi một bước về phía trước) thường là một tính năng trình gỡ lỗi cấp độ lắp ráp hoặc C. Ví dụ. gdb có thể làm điều đó:

https://sourceware.org/gdb/wiki/ReverseDebug

Bidirectional (or reverse) debugging

Reverse debugging is utterly complex, and may have performance penalty of 50.000x. Nó cũng đòi hỏi sự hỗ trợ rộng rãi từ các công cụ gỡ lỗi. Máy ảo Python không cung cấp hỗ trợ gỡ lỗi ngược.

Nếu bạn đang đánh giá tương tác mã Python, tôi khuyên bạn thử dùng số IPython Notebook cung cấp vỏ Python tương tác dựa trên HTML. Bạn có thể dễ dàng viết mã của bạn và trộn và khớp lệnh. Tuy nhiên, không có hỗ trợ sửa lỗi pdb. Có ipdb cung cấp lịch sử tốt hơn và các cơ sở tìm kiếm cho các lệnh gỡ lỗi đã nhập, nhưng nó không thực hiện các bước nhảy lùi trực tiếp hoặc theo như tôi biết.

6

PyPy đã bắt đầu triển khai RevDB, hỗ trợ gỡ lỗi ngược.

Đó là (tính đến tháng 2 năm 2017) vẫn ở giai đoạn alpha, chỉ hỗ trợ Python 2.7, chỉ hoạt động trên Linux hoặc OS X và yêu cầu bạn tự xây dựng Python từ bản sửa đổi đặc biệt. Nó cũng rất chậm và sử dụng rất nhiều RAM. Để trích dẫn trang Bitbucket:

Lưu ý rằng tệp nhật ký thường phát triển với tốc độ 1-2 MB mỗi giây. Giả sử kích thước không phải là vấn đề, yếu tố giới hạn là:

  • Thời gian phát lại. Nếu quá trình thực hiện được ghi lại của bạn mất hơn một vài phút, việc phát lại sẽ chậm một cách đau đớn. Đôi khi nó cần phải đi qua toàn bộ nhật ký nhiều lần trong một phiên duy nhất. Nếu lỗi xảy ra ngẫu nhiên nhưng hiếm khi, bạn nên chạy ghi trong vài phút, sau đó giết quá trình và thử lại, liên tục cho đến khi bạn gặp sự cố.
  • Mức sử dụng RAM để phát lại. Yêu cầu bộ nhớ RAM lớn hơn 10 hoặc 15 lần để phát lại hơn là để ghi.Nếu đó là quá nhiều, bạn có thể thử với giá trị thấp hơn cho MAX_SUBPROCESSES trong _revdb/process.py, nhưng nó sẽ luôn lớn hơn vài lần.

Cụ thể trên PyPy blog và lắp đặt và sử dụng hướng dẫn có trên RevDB bitbucket page.

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