2013-09-23 69 views
5

Tôi có ứng dụng Python đa luồng chạy trên máy chủ Linux. Tôi có thể sử dụng Debug Server của PyDev để gỡ lỗi từ xa vào nó, mà có vẻ như một nguồn tài nguyên gỡ lỗi rất có giá trị. Tuy nhiên, có một vấn đề mà tôi thấy đang ngăn nó trở nên hữu ích như tôi muốn.Bắt PyDev đình chỉ hoạt động trên các chủ đề khác với MainThread

Trong khi ứng dụng của tôi đang chạy trên máy chủ, tôi có thể đi vào Eclipse trên hộp khác, tạm dừng MainThread, nhận được dấu vết ngăn xếp tốt nhất vào thời điểm đó, sau đó tiếp tục thực hiện. Thật tuyệt vời. Tuy nhiên, khi tôi thử nó trên một trong các chủ đề con, nút đình chỉ màu xám ra nhưng không có dấu vết ngăn xếp và tất cả mọi thứ chỉ tiếp tục chạy như bình thường. Tôi có thể thấy trong cửa sổ Debug rằng có một chủ đề con và nó là PID, nhưng không thể thực sự kiểm soát nó hoặc xem nó là gì. Nhấp chuột phải và thử "ngăn xếp sao chép" hữu ích "chỉ mang lại cho tôi" Thread-4 - pid29848_seq5 ".

Điểm ngắt có vẻ hoạt động tốt. Nếu một chuỗi con truy cập vào một trong số đó, tôi có thể xem qua và xem các biến và như vậy. Tuy nhiên, việc sử dụng hiệu quả đó yêu cầu tôi phải có một điểm quan tâm cụ thể trong mã. Tôi thực sự đang tìm cách chạy ứng dụng của mình và khi nó trở thành một trạng thái bất thường, hãy sử dụng PyDev để xem những gì đang diễn ra.

Tôi có vấn đề gì với thiết lập của mình không? Đây có phải chỉ là một hạn chế của PyDev tôi chống lại? Làm thế nào tôi có thể thấy những gì đang xảy ra với các chủ đề con?

+0

Tôi đang gặp vấn đề tương tự. Eclipse, PyDev, Django, máy chủ từ xa bằng lệnh manage.py runserver --noautoreload. Không may mắn, tôi không thể đặt điểm ngắt trong bất kỳ chế độ xem nào. –

+0

Vì vậy, tôi đã thêm time.sleep (10000) vào một trong các phương thức get view của mã python của tôi, và PyDev không có stack hiển thị, tôi có thể thấy thread nhưng không có stack. –

+0

Vì vậy, tôi đã nhận được đến điểm mà tôi đã có thể nhìn thấy ngăn xếp bên trong các chủ đề bằng cách thêm: pydevd.settrace (suspend = False) ngay trước điểm ngắt, bất kỳ vị trí nào trong chuỗi trước mã với điểm ngắt sẽ thực hiện , nhưng không chắc chắn tại sao điều này là cần thiết bởi vì theo tài liệu riêng của python cho settrace() "Thiết lập một chức năng theo dõi cho tất cả các chủ đề bắt đầu từ các mô-đun luồng." Sẽ được nhìn vào điều này hơn nữa. –

Trả lời

-2

Cho rằng Python không thực sự làm chủ đề đúng (GIL là ràng buộc để cock điều lên một cách này hay cách khác) Tôi sẽ không ngạc nhiên nếu gỡ lỗi chúng là một kinh nghiệm ít hơn ly kỳ. Nếu nói đến nó không phải là một kinh nghiệm tốt hoặc gỡ lỗi C/C++ chủ đề, ngay cả dưới các phiên bản mới nhất của GDB và CDT.

Tôi thực sự không biết chắc chắn nhưng tôi có linh cảm áp dụng nhiều quy trình bằng Python thay vì nhiều chủ đề có thể làm cho trải nghiệm của bạn tốt hơn. Nếu bạn sắp xếp mọi thứ sao cho một cá thể đơn của Eclipse/PyDev đã gỡ lỗi một quy trình Python đơn lẻ, bạn có thể kết thúc với rất nhiều cửa sổ trên màn hình của mình nhưng nó sẽ là một trải nghiệm gỡ lỗi linh hoạt hơn nhiều.

Đó là những gì tôi đã sử dụng để thực hiện trong VxWorks ở C, nơi không có luồng hoặc quy trình nào chỉ là các tác vụ. Một hệ quả là bạn có thể chạy một trình gỡ lỗi cho mỗi tác vụ và nó thật tuyệt vời.

0

Tôi cố gắng tìm nó sau khi xem xét một trong những bài viết của Fabio:

threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch) 

nên được bổ sung sau khi bạn gọi pydev.settrace()