Làm thế nào để lùi lại trong trình gỡ lỗi Eclipse?


129

Có thể thực hiện ngược lại trong trình gỡ lỗi Eclipse? Dự án hiện tại tôi đang thực hiện đòi hỏi tối thiểu 5 giây để đọc và khởi tạo dữ liệu từ một tệp trước khi có thể thực hiện bất kỳ điều gì. Nếu tôi vượt qua trình gỡ lỗi, tôi phải chấm dứt chương trình và khởi động lại, và điều này sẽ mất một chút thời gian.

Câu trả lời:


136

Bạn có thể sử dụng lệnh drop to frame của Eclipse để nhập lại phương thức hiện tại từ đầu. Nhưng nó sẽ không kiểm soát bất kỳ thay đổi trạng thái nào đã xảy ra, vì vậy nó có thể không hoạt động tùy thuộc vào loại phương pháp bạn đang sử dụng.

Một công cụ thực sự tuyệt vời khác thực sự cho phép bạn lùi lại và chuyển tiếp theo thời gian là Trình gỡ lỗi Omniscient . Nó hoạt động bằng cách ghi các lớp khi chúng được tải trong trình nạp lớp, vì vậy nó có thể ghi lại mọi thứ mà mã của bạn thực hiện. Nó có thể làm những điều rất tuyệt vời, như trả lời "khi nào, ở đâu và tại sao trường này được gán giá trị hiện tại của nó?". Giao diện người dùng khá cồng kềnh và nó có thể khó xử lý các cơ sở mã lớn, nhưng đối với một số trường hợp, nó thực sự có thể tiết kiệm rất nhiều thời gian.

Cập nhật : Chronon cung cấp một sản phẩm thương mại mà nó mô tả là "DVR cho Java", có vẻ như thực hiện rất nhiều thứ giống như ODB.


@Matt McHenry Tôi đã thử sử dụng ODB1.5; với một chương trình java độc lập nhưng tôi không chắc làm thế nào để nó hoạt động? Bạn có tài nguyên nào khác ngoài trang ODB giải thích các bước để làm cho nó hoạt động độc lập và với Eclipse không?
Ayusman

@Ayusman: không, tôi xin lỗi, tôi không có gì để chia sẻ ngoài những gì trên trang ODB. Tôi sẽ không ngạc nhiên nếu nó không hoạt động với các định dạng tệp. Class mới hơn, trong số những thứ khác. :(
Matt McHenry

Câu trả lời thú vị!
KrishPrabakar

Xuất hiện trang web Omnscient Debugger đã được định dạng tên miền.
Thorbjørn Ravn Andersen

45

Ngoài những gì đã được đề cập trong các câu trả lời trước - tức là tính năng thả khung của Eclipse trong chế độ gỡ lỗi , khởi động lại gỡ lỗi trước đó trong khung ngăn xếp (nhưng không hoàn nguyên dữ liệu toàn cầu / tĩnh) và trình gỡ lỗi Omniscient , hơi thô và không quá nhiều đang phát triển - có một vài công cụ dựa trên Eclipse có thể được sử dụng để "quay lại" trong thời gian (chạy):

JIVE mở rộng trình gỡ lỗi Java Eclipse với khả năng ghi lại các trạng thái của chương trình. Phối cảnh JIVE cung cấp một số sơ đồ UML hữu ích được cập nhật trong khi chương trình đang chạy. Các sơ đồ này cung cấp một cái nhìn tổng quan về trạng thái của ứng dụng (sơ đồ đối tượng) và dấu vết ngăn xếp (sơ đồ trình tự). Bạn có thể truy vấn dấu vết ghi nhớ và lùi lại và chuyển tiếp theo thời gian và xem các sơ đồ tương ứng.

Diver chỉ ghi lại các cuộc gọi phương thức và không thực sự ghi lại các trạng thái chương trình như JIVE. Mỗi sự kiện gọi phương thức được lưu trữ để phục hồi và phân tích sau này. Nó mở rộng các cấu hình Java Run và Debug chủ yếu để chỉ định các bộ lọc. Dấu vết có thể được tạm dừng / tiếp tục / lọc khi chạy. Sau khi được ghi lại, phối cảnh Diver có thể hiển thị nó trong sơ đồ trình tự tương tác.

JIVE và Diver là các dự án nguồn mở được phát hành từ nghiên cứu học thuật. Tính đến tháng 11 năm 2012 cả hai dự án đang hoạt động.

Chronon là một sản phẩm thương mại, nhưng họ có giấy phép miễn phí cho sinh viên và các dự án nguồn mở. Từ những gì được tuyên bố trên trang web của họ, nó có lẽ là máy ghi âm toàn diện nhất vì nó có thể phát lại lịch sử đã ghi, bước qua lại, cho phép khi họ nói gỡ lỗi thời gian. Ngoài ra Eclipse không cần thiết để ghi.

Tất cả các plugin này đều khá tham lam về tài nguyên, vì vậy tốt nhất là có một máy spec tốt và sử dụng tính năng lọc của chúng. Một yêu cầu nhất định để chạy chúng thành công là mở rộng không gian heap trong eclipse.ini .

Trong trường hợp của tôi, tôi đã cố gắng sử dụng JIVE và Diver để gỡ lỗi chương trình phân tích cú pháp XML nhưng luôn kết thúc nhật thực đóng băng do thiếu tài nguyên. Diver có thể khó chạy trên linux 64 bit , nó hoạt động trên Ubuntu 32 bit và có thể các bản phân phối 32 bit khác sử dụng các mẹo này . Diver hoạt động trên Windows, tốt hơn nữa là trên JVM Windows 64 bit + 64 bit nếu không bạn sẽ bị giới hạn trong không gian heap tối đa 1,3-1,6Gb trên các cửa sổ 32 bit . JIVE hoạt động tốt trên linux 64bit của tôi và dường như hoạt động tốt trên các nền tảng khác.


Thợ lặn đã ngừng hoạt động
merours

12

, CDT Eclipse có hỗ trợ tính năng gỡ lỗi lịch sử.

Cấu hình gỡ lỗi mở -> Trình gỡ lỗi -> Bật gỡ lỗi ngược khi khởi động .

Hơn bạn có thể nhấn shift+F5hoặc shift+F6cho bước lùi thích F5hoặc F6cho bước tiến.


1
Liệu tùy chọn này có tồn tại trong tất cả các phiên bản của Eclipse không? Tôi bị nguy hiểm nếu tôi có thể tìm thấy nó ở bất cứ đâu.
Kỹ

1
GDB của nó tính năng sourceware.org/gdb/wiki/ReverseDebug rằng hỗ trợ trong Eclipse của thành viên này bugs.eclipse.org/bugs/show_bug.cgi?id=258284 yêu cầu. Vâng, tôi cho rằng câu trả lời là có từ năm 2009.
Sergei

Nó có thể truy cập trong CDT.
Sergei

Tôi là một nhà phát triển Java, vì vậy tôi đoán CDT sẽ không được sử dụng nhiều cho tôi?
EngineeringBetter_DJ

@Sergei Tôi đang thực hiện việc này trong WIndows 7 SP1 với phiên bản Springsource cũ. Để bật gỡ lỗi ngược, trước tiên bạn phải gỡ lỗi là-> Cấu hình gỡ lỗi-> Chính. Ở dưới cùng của trang là trình khởi chạy quy trình. Nó sẽ nói "Sử dụng Trình tạo quy trình tạo tiêu chuẩn" và sẽ có một siêu liên kết đến "Chọn mục khác ...". Nhấp vào đây và đảm bảo "Sử dụng cài đặt cụ thể cấu hình" được chọn sau đó chọn "GDB (GSF) Tạo Trình khởi chạy quy trình" và nhấp vào ổn. "Sử dụng GDB (GSF) Tạo trình khởi chạy quy trình" bây giờ sẽ được hiển thị ở dưới cùng của tab chính.
Sammy

5

Tôi thiên vị, nhưng Chronon làm chính xác những gì bạn đang tìm kiếm.

Drop to Frame không chính xác là lùi lại, vì nếu phương thức đã thay đổi bất cứ thứ gì trên heap thì nó sẽ không được hoàn nguyên.


1
Chronon có cho phép bạn làm điều đó trong thời gian thực không? Hiểu biết của tôi là trước tiên bạn cần ghi lại một phiên bằng chronon và sau đó bạn có thể lùi lại trong phiên đó. Điều đó có tốt như khởi động lại ứng dụng không? Hoặc có lẽ tôi đang thiếu thứ gì đó ..
Raam

2
có, bạn cần phải ghi lại ứng dụng của mình trước và sau đó có thể gỡ lỗi nó bất cứ lúc nào sau khi ghi. Nó khác với việc khởi động lại ứng dụng vì bạn không cần trải qua tất cả các bước để tạo lại lỗi. Tất cả những gì bạn làm là ghi lại lỗi một lần và sau đó bạn có thể xem xét bất cứ lúc nào bạn muốn gỡ lỗi chỉ bằng cách ghi. Bạn không cần bất kỳ phần nào của môi trường ban đầu để phát lại bản ghi.
pdeva

Chronon có hoạt động trong môi trường docker không? Nhật thực của tôi không ở địa phương ..
Choi

3

Tôi cũng đang tìm kiếm tính năng này trong nhật thực. Tôi biết phòng thu hình ảnh có thể làm điều đó. Trên thực tế, bạn có thể kéo điểm đánh dấu dòng hiện tại và thả lại bất cứ nơi nào trong mã. Tôi không chắc chắn nếu thay đổi các biến có thể được hoàn tác. Nhưng nó vẫn rất hữu ích ngay cả như vậy và tiết kiệm rất nhiều thời gian. Tôi đã chờ đợi điều này trong nhật thực rất lâu.


1

Câu hỏi không chỉ định ngôn ngữ Eclipse và nhiều câu trả lời giả định Java.

Nếu sử dụng C ++ và GCC với trình gỡ lỗi GDB, Eclipse Run->Move to Linesẽ thực hiện công việc và các chức năng như Visual Studio Set Next Statement . Trong trường hợp này, Eclipse đang sử dụng khả năng trong GDB.

Nếu sử dụng Java, tôi không biết cách nào với Eclipse hoặc Netbeans, mặc dù các câu trả lời khác có các plugin được đề xuất. Eclipse có lệnh "drop to frame" hoạt động cho Java trong phiên bản của tôi (Juno SR1). Nếu tôi sửa đổi và lưu mã trong một hàm trong chế độ gỡ lỗi, dòng thực thi sẽ tự động di chuyển đến đỉnh của hàm hiện tại và tôi có thể tiếp tục từ đó. Không giống như chỉ định dòng, nhưng nó là một cái gì đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.