2009-11-23 8 views
6

Tôi phải chạy một trang web Zope2 cũ và có một số than phiền với nó. Vấn đề lớn nhất là, đôi khi, nó chỉ bị khóa, chạy ở mức tải CPU 100% và không trả lời yêu cầu nữa. Mặc dù vấn đề không thể tái sản xuất một cách thường xuyên, một trang có chứa 3 đồ thị động kích hoạt nó đôi khi, vì vậy tôi nghi ngờ một số loại tình trạng chạy đua dẫn đến vòng lặp vô tận hoặc bận rộn bận rộn.Nhận stacktrace từ quá trình python bị mắc kẹt

Vấn đề là, tôi chưa tìm ra cách để gỡ lỗi điều này. Không có gì trong nhật ký Zope và không có gì trong nhật ký hệ thống. Tôi đã thử các đề xuất từ ​​this question để nhận stacktrace, nhưng tín hiệu duy nhất có bất kỳ hiệu ứng nào là SIGKILL.

Có khả năng nào khác để tìm ra chính xác quy trình là khi nào nó bị kẹt không?

Trả lời

0

Nếu quá trình bị kẹt theo cách mà không có tín hiệu nào khác đi qua, bạn có thể cân nhắc chạy nó từ trình gỡ rối, thay vì cố gắng đính kèm nó vào thời gian chạy.

Ngoài ra, nó có thể hữu ích cho các chiến thuật gỡ lỗi khác, như tắt một số phần nhất định của mã để tìm hiểu trường hợp tối thiểu mà nó vẫn có thể tái sản xuất để xem nguyên nhân nào tốt hơn.

1

Bạn có thể thử đính kèm trình gỡ lỗi vào quy trình đang chạy. Xem thêm this question.

2

Xem câu trả lời của tôi cho this SO question, sử dụng Products.signalstack. Nó đăng ký cùng một trình xử lý như câu trả lời bạn đã tìm thấy, tại thời điểm đăng ký sản phẩm. Có lẽ nó hoạt động tốt hơn cho bạn.

Nếu không, bạn có thể có vấn đề I/O ở cấp hệ điều hành trên tay và hy vọng duy nhất của bạn là gắn gdb vào tiến trình. Tìm kiếm Stack Overflow cho câu trả lời gdb; có rất nhiều thông tin ở đây!

+1

+1 Cũng có thể sử dụng ** pstack ** và ** lsstack **. –

0

sau khi chạy vòng quanh internet trong vòng kết nối trong một thời gian tôi cuối cùng đã kết thúc tại đây: http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - mô tả chi tiết cách tất cả các phần khớp với nhau. báo giá tiền cho tôi là 'gdb /usr/bin/python -p $ PID' - tên của tệp thực thi được yêu cầu để gdb tìm thấy tệp thông tin gỡ lỗi chính xác.

2

Bạn có thể in theo dõi ngăn xếp đẹp bằng cách sử dụng pyrasite.

Trước tiên, bạn cần phải cài đặt gdb.

# Redhat, CentOS, etc 
$ yum install gdb 

# Ubuntu, Debian, etc 
$ apt-get update && apt-get install gdb 

Sau đó, cài đặt pyrasite.

$ pip install pyrasite 

Sử dụng ps hoặc một số phương pháp khác để tìm quá trình ID cho quá trình trăn bị mắc kẹt và chạy pyrasite-shell với nó.

# Assuming process ID is 12345 
$ pyrasite-shell 12345 

Bây giờ bạn sẽ thấy một REPL trăn. Chạy sau đây trong REPL để xem dấu vết ngăn xếp cho tất cả các chủ đề.

import sys, traceback 
for thread_id, frame in sys._current_frames().items(): 
    print 'Stack for thread {}'.format(thread_id) 
    traceback.print_stack(frame) 
    print ''