2011-01-17 35 views

Trả lời

9

Winpdb là định nghĩa khá nhiều về trình gỡ rối Python thông minh hơn. Nó hỗ trợ rõ ràng going down a fork, không chắc chắn nó hoạt động độc đáo với multiprocessing.Process() nhưng nó đáng để thử.

Để biết danh sách các ứng cử viên kiểm tra hỗ trợ cho trường hợp sử dụng của bạn, hãy xem danh sách Python Debuggers trong wiki.

+1

Tuyệt vời! Winpdb hoạt động tốt với multiprocessing.Process() – grep

+0

Cần lưu ý rằng Winpdb là phần mềm đa nền tảng, miễn phí và miễn phí. – OliverUv

+0

Tôi không thể, trong vòng 20 phút đọc và chơi với winpdb, tìm cách khởi chạy một phiên gỡ lỗi tương tác trong một tập lệnh hiện có thông qua nhập khẩu, a la 'pdb nhập; pdb.set_trace() '. Tuy nhiên, câu trả lời ForkedPdb ở đây làm việc như một sự quyến rũ! – Pat

-1

Nếu bạn đang sử dụng nền tảng được hỗ trợ, hãy thử DTrace. Hầu hết các BSD/Solaris/OS X hỗ trợ gia đình DTrace.

Here is an intro by the author. Bạn có thể sử dụng Dtrace để gỡ lỗi mọi thứ.

Here is a SO post khi tìm hiểu DTrace.

35

Tôi đã tìm kiếm một giải pháp đơn giản để cho vấn đề này và đã đưa ra với điều này:

import sys 
import pdb 

class ForkedPdb(pdb.Pdb): 
    """A Pdb subclass that may be used 
    from a forked multiprocessing child 

    """ 
    def interaction(self, *args, **kwargs): 
     _stdin = sys.stdin 
     try: 
      sys.stdin = open('/dev/stdin') 
      pdb.Pdb.interaction(self, *args, **kwargs) 
     finally: 
      sys.stdin = _stdin 

Sử dụng nó giống như cách bạn có thể sử dụng PDB cổ điển:

ForkedPdb().set_trace() 
+4

điều này là tuyệt vời và đã làm các trick cho tôi –

+0

Cảm ơn, điều này làm việc cho tôi là tốt. – xamox

+0

Mẹo hay. Tôi sẽ đề nghị lưu trữ sys.stdin khi chương trình bắt đầu và sử dụng nó trong quá trình chia nhỏ thay vì mở '/ dev/stdin'. Tôi không biết lý do nhưng readline hoạt động tốt sau đó. Tôi sẽ nghiên cứu một chút về điều này sau. – memeplex

2

này là một sự giải thích câu trả lời của Romuald để khôi phục stdin gốc bằng cách sử dụng bộ mô tả tập tin của nó. Điều này giữ cho readline hoạt động bên trong trình gỡ rối. Bên cạnh đó, quản lý đặc biệt pdb của KeyboardInterrupt bị vô hiệu hóa, để nó không can thiệp vào xử lý đa xử lý sigint.

class ForkablePdb(pdb.Pdb): 

    _original_stdin_fd = sys.stdin.fileno() 
    _original_stdin = None 

    def __init__(self): 
     pdb.Pdb.__init__(self, nosigint=True) 

    def _cmdloop(self): 
     current_stdin = sys.stdin 
     try: 
      if not self._original_stdin: 
       self._original_stdin = os.fdopen(self._original_stdin_fd) 
      sys.stdin = self._original_stdin 
      self.cmdloop() 
     finally: 
      sys.stdin = current_stdin 
Các vấn đề liên quan