2008-09-26 14 views
20

Tôi có một ứng dụng Python ở trạng thái lạ. Tôi không muốn làm gỡ lỗi trực tiếp quá trình. Tôi có thể đổ nó vào một tập tin và kiểm tra trạng thái của nó sau này không? Tôi biết tôi đã khôi phục các tệp lõi của các chương trình C trong gdb sau này, nhưng tôi không biết cách kiểm tra một ứng dụng Python theo cách hữu ích từ gdb.Làm cách nào để kết xuất toàn bộ quá trình Python để kiểm tra gỡ lỗi sau?

(Đây là một biến thể của câu hỏi của tôi về debugging memleaks in a production system.)

+0

Cũng lưu ý rằng tín hiệu QUIT (Ctrl - \\) cũng đổ lõi. – tzot

Trả lời

4

Không có cách nào khác hơn là dựng sẵn hủy (với os.abort(), gây ra coredump nếu giới hạn nguồn lực cho phép nó) - mặc dù bạn có thể chắc chắn xây dựng chức năng 'dump' của riêng bạn để kết xuất thông tin có liên quan về dữ liệu mà bạn quan tâm. Không có công cụ làm sẵn cho nó.

Để xử lý tệp lõi của quy trình Python, Python source has a gdbinit file có chứa macro hữu ích. Nó vẫn còn đau đớn hơn rất nhiều so với bằng cách nào đó đi vào quá trình chính nó (với pdb hoặc thông dịch viên tương tác) nhưng nó làm cho cuộc sống dễ dàng hơn một chút.

+0

Bạn có thể thêm một trình xử lý tín hiệu để kết xuất trạng thái Python và mở nó trong trình gỡ lỗi bằng cách sử dụng http://github.com/gooli/pydump. – gooli

+0

Vì phản ứng ban đầu của Thomas Wouters, nó có thể mở rộng 'gdb' bằng Python, và David Malcolm đã viết một phần mở rộng tuyệt vời cung cấp nhiều chức năng hơn so với tệp gdbinit. Điều tuyệt vời là tất cả đi kèm với nhiều bản phân phối Linux bây giờ (như Ubuntu 14.04) và không yêu cầu bất kỳ biên dịch bổ sung nào.Tôi đã ghi lại các khám phá của riêng mình với nó trong [Cuộc phiêu lưu trong Python Core Dumping] (https://gist.github.com/toolness/d56c1aab317377d5d17a) cho bất kỳ ai quan tâm. –

1

Ai đó ở trên nói rằng không có cách nào được xây dựng để thực hiện việc này, nhưng điều đó không hoàn toàn đúng. Ví dụ, bạn có thể xem xét các công cụ gỡ lỗi giá treo. Khi có ngoại lệ, trình xử lý ngoại lệ lưu dấu vết ngăn xếp và in một URL trên bảng điều khiển có thể được sử dụng để truy xuất phiên gỡ lỗi qua HTTP.

Mặc dù chúng có thể giữ các phiên này trong bộ nhớ, chúng chỉ là các đối tượng python, vì vậy không có gì ngăn bạn ngừng phân vùng và khôi phục sau để kiểm tra. Điều đó có nghĩa là một số thay đổi đối với ứng dụng, nhưng có thể là ...

Sau một số nghiên cứu, hóa ra mã thực sự có liên quan đến từ số EvalException module của Dán. Bạn sẽ có thể nhìn vào đó để tìm ra những gì bạn cần.

+0

Dấu vết ngăn xếp có thể dễ dàng có được, nhưng tôi quan tâm hơn đến toàn bộ các đối tượng được phân bổ hơn là trong những gì xảy ra trong ngăn xếp tại thời điểm này. – keturn

0

This answer đề xuất tạo phân đoạn lõi chương trình của bạn và sau đó tiếp tục thực hiện trên một hộp tương tự đầy đủ khác.

0

Cũng có thể viết thứ gì đó sẽ đổ tất cả các dữ liệu từ quá trình, ví dụ:

  • Pickler mà bỏ qua các đối tượng nó không thể dưa (thay thế chúng bằng cái gì khác) (ví dụ Python: Pickling a dict with some unpicklable items)
  • Phương pháp mà đệ quy chuyển đổi tất cả mọi thứ vào thứ serializable (ví dụ this, ngoại trừ nó cần một tấm séc cho recursing vô hạn các đối tượng và làm điều gì đó với chúng, cũng có thể thử dir()getattr() để xử lý một số đối tượng không xác định, ví dụ như các lớp mở rộng).

Nhưng để lại một quy trình đang chạy với cửa cống hoặc giá treo hoặc một cái gì đó tương tự như vậy chắc chắn có vẻ thuận tiện hơn khi có thể.

(Ngoài ra, tôi tự hỏi nếu có điều gì đó thuận tiện hơn được viết kể từ khi câu hỏi này được hỏi lần đầu)

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