2012-01-08 32 views
6

Có một thư viện bên ngoài mà tôi đang làm việc với việc thường xuyên cố định CPU của mình. Tôi muốn giúp tác giả sửa chữa nó (như tôi thực sự thích thư viện), nhưng tôi không biết làm thế nào để gỡ lỗi các tai nạn đúng cách.Làm thế nào để gỡ lỗi Emacs lisp mà làm cho Emacs sụp đổ/sử dụng CPU 100%?

Bất kỳ mẹo nào để gỡ lỗi Emacs lisp? Ghi nhớ khi nó đổ vỡ Emacs không hoạt động nữa và tôi phải giết nó (vì vậy các giải pháp bên trong Emacs có thể không hữu ích).

Chỉnh sửa: Tôi nên làm rõ rằng nó được biên dịch byte và vấn đề này không phải lúc nào cũng xảy ra với người khác, vì vậy nó có thể dành riêng cho kiến ​​trúc/tệp init của tôi. Nó chắc chắn liên quan đến thư viện này.

+0

Nếu nó không phải là một vòng lặp vô hạn nhưng chỉ là một số mã thực sự phức tạp, bạn đã xem xét cố gắng biên dịch byte trước khi sử dụng chưa? –

+0

Nó được biên dịch theo byte. Cảm ơn mặc dù! –

+0

Tôi không tốt với backtraces, và tôi nghi ngờ bạn không phải là, hoặc, nhưng gắn với một trình gỡ lỗi và in một dấu vết có thể giúp thu hẹp tìm kiếm phần nào. Khác hơn là, rắc mã với gỡ lỗi in ... – tripleee

Trả lời

6

Trước tiên, hãy luôn gỡ lỗi phiên bản chưa được biên dịch của chương trình Emacs-Lisp, trừ khi bạn bị thuyết phục rằng sự cố được giới thiệu bởi trình biên dịch byte.

Thứ hai, nếu mã đang treo Emacs thì mã có thể nằm trong một vòng lặp vô hạn với chế độ chặn bỏ ràng buộc không phải nil. Vì vậy, điều đầu tiên cần làm là đi qua các nguồn cho thư viện và thay đổi tất cả các tham chiếu ức chế-bỏ cái gì khác để C-g sẽ làm việc để ngăn chặn vòng lặp. Sau đó, tải lên thư viện, đặt debug-on-quit thành t và bạn sẽ nhận được một dấu vết gỡ lỗi tốt đẹp khi bạn nhấn C-g cho bạn biết nơi mã đang lặp. Từ đó, gỡ lỗi vấn đề phải đơn giản như gỡ lỗi bất kỳ vòng lặp vô hạn nào khác.

+0

Vấn đề với việc sử dụng nó không biên dịch là nó về cơ bản không sử dụng được do hiệu quả của nó. Tôi sẽ xem nếu có bất kỳ cuộc gọi 'ức chế-bỏ-bỏ 'trong codebase, đó là một cuộc gọi tốt. –

+0

Không có bất kỳ lệnh gọi 'ức chế khi thoát 'nào. Tôi sẽ thử điều 'debug-on-quit'. –

+0

ức chế-bỏ thuốc lá không ức chế-on-quit. Nó thường sẽ bị ràng buộc như thế này: (let ((ức chế-bỏ t) ...) ... một số mã ...) –

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