Add and use a pdb instance factory
parent
ed9c359a1d
commit
206a001362
|
@ -283,9 +283,9 @@ async def _hijack_stdin_for_child(
|
|||
assert await stream.receive() == 'pdb_unlock'
|
||||
|
||||
except (
|
||||
# BaseException,
|
||||
trio.MultiError,
|
||||
Exception,
|
||||
BaseException,
|
||||
# trio.MultiError,
|
||||
# Exception,
|
||||
# trio.BrokenResourceError,
|
||||
# trio.Cancelled, # by local cancellation
|
||||
# trio.ClosedResourceError, # by self._rx_chan
|
||||
|
@ -301,7 +301,7 @@ async def _hijack_stdin_for_child(
|
|||
if lock and lock.locked():
|
||||
lock.release()
|
||||
|
||||
if isinstance(err, trio.Cancelled):
|
||||
# if isinstance(err, trio.Cancelled):
|
||||
raise
|
||||
|
||||
finally:
|
||||
|
@ -381,6 +381,28 @@ async def wait_for_parent_stdin_hijack(
|
|||
log.debug(f"Child {actor_uid} released parent stdio lock")
|
||||
|
||||
|
||||
def mk_mpdb() -> (MultiActorPdb, Callable):
|
||||
|
||||
pdb = MultiActorPdb()
|
||||
signal.signal = pdbpp.hideframe(signal.signal)
|
||||
orig_handler = signal.signal(
|
||||
signal.SIGINT,
|
||||
partial(shield_sigint, pdb_obj=pdb),
|
||||
)
|
||||
pdb.allow_kbdint = True
|
||||
pdb.nosigint = True
|
||||
|
||||
# TODO: add this as method on our pdb obj?
|
||||
def undo_sigint():
|
||||
# restore original sigint handler
|
||||
signal.signal(
|
||||
signal.SIGINT,
|
||||
orig_handler
|
||||
)
|
||||
|
||||
return pdb, undo_sigint
|
||||
|
||||
|
||||
async def _breakpoint(
|
||||
|
||||
debug_func,
|
||||
|
@ -402,15 +424,7 @@ async def _breakpoint(
|
|||
# scope here???
|
||||
# with trio.CancelScope(shield=shield):
|
||||
|
||||
pdb = MultiActorPdb()
|
||||
signal.signal = pdbpp.hideframe(signal.signal)
|
||||
orig_handler = signal.signal(
|
||||
signal.SIGINT,
|
||||
partial(shield_sigint, pdb_obj=pdb),
|
||||
)
|
||||
pdb.allow_kbdint = True
|
||||
pdb.nosigint = True
|
||||
|
||||
pdb, undo_sigint = mk_mpdb()
|
||||
actor = tractor.current_actor()
|
||||
task_name = trio.lowlevel.current_task().name
|
||||
|
||||
|
@ -449,11 +463,9 @@ async def _breakpoint(
|
|||
def child_release_hook():
|
||||
# _local_task_in_debug = None
|
||||
_local_pdb_complete.set()
|
||||
|
||||
# restore original sigint handler
|
||||
signal.signal(
|
||||
signal.SIGINT,
|
||||
orig_handler
|
||||
)
|
||||
undo_sigint()
|
||||
|
||||
# assign unlock callback for debugger teardown hooks
|
||||
# _pdb_release_hook = _local_pdb_complete.set
|
||||
|
@ -523,10 +535,7 @@ async def _breakpoint(
|
|||
_local_pdb_complete.set()
|
||||
|
||||
# restore original sigint handler
|
||||
signal.signal(
|
||||
signal.SIGINT,
|
||||
orig_handler
|
||||
)
|
||||
undo_sigint()
|
||||
|
||||
_pdb_release_hook = teardown
|
||||
|
||||
|
@ -664,7 +673,7 @@ def _set_trace(
|
|||
# last_f = frame.f_back
|
||||
# last_f.f_globals['__tracebackhide__'] = True
|
||||
|
||||
if actor is not None:
|
||||
if pdb and actor is not None:
|
||||
log.pdb(f"\nAttaching pdb to actor: {actor.uid}\n")
|
||||
|
||||
pdb.set_trace(
|
||||
|
@ -673,15 +682,13 @@ def _set_trace(
|
|||
)
|
||||
|
||||
else:
|
||||
pdb, undo_sigint = mk_mpdb()
|
||||
|
||||
# we entered the global ``breakpoint()`` built-in from sync code?
|
||||
assert 0, 'Woa this path finally triggered?'
|
||||
global _local_task_in_debug, _pdb_release_hook
|
||||
_local_task_in_debug = 'sync'
|
||||
|
||||
def nuttin():
|
||||
pass
|
||||
|
||||
_pdb_release_hook = nuttin
|
||||
_pdb_release_hook = undo_sigint
|
||||
|
||||
pdb.set_trace(
|
||||
# start 2 levels up in user code
|
||||
|
|
Loading…
Reference in New Issue