| |
| |
| |
| |
|
|
| import multiprocessing |
| import os |
| import pdb |
| import sys |
|
|
|
|
| __all__ = ["set_trace"] |
|
|
|
|
| _stdin = [None] |
| _stdin_lock = multiprocessing.Lock() |
| try: |
| _stdin_fd = sys.stdin.fileno() |
| except Exception: |
| _stdin_fd = None |
|
|
|
|
| class MultiprocessingPdb(pdb.Pdb): |
| """A Pdb wrapper that works in a multiprocessing environment. |
| |
| Usage: `from fairseq import pdb; pdb.set_trace()` |
| """ |
|
|
| def __init__(self): |
| pdb.Pdb.__init__(self, nosigint=True) |
|
|
| def _cmdloop(self): |
| stdin_bak = sys.stdin |
| with _stdin_lock: |
| try: |
| if _stdin_fd is not None: |
| if not _stdin[0]: |
| _stdin[0] = os.fdopen(_stdin_fd) |
| sys.stdin = _stdin[0] |
| self.cmdloop() |
| finally: |
| sys.stdin = stdin_bak |
|
|
|
|
| def set_trace(): |
| pdb = MultiprocessingPdb() |
| pdb.set_trace(sys._getframe().f_back) |
|
|