Support sync code breakpointing via built-in

Override `breakpoint()` for sync code making it work
properly with `trio` as per:

https://github.com/python-trio/trio/issues/1155#issuecomment-742964018

Relates to #193
sync_breakpoint
Tyler Goodlet 2021-02-15 19:23:53 -05:00
parent d8b6c0093c
commit 109066dda9
3 changed files with 31 additions and 9 deletions

View File

@ -274,14 +274,31 @@ def _mk_pdb():
return pdb return pdb
def _set_trace(actor): def _set_trace(actor=None):
log.runtime(f"\nAttaching pdb to actor: {actor.uid}\n")
pdb = _mk_pdb() pdb = _mk_pdb()
pdb.set_trace(
# start 2 levels up in user code if actor is not None:
frame=sys._getframe().f_back.f_back, log.runtime(f"\nAttaching pdb to actor: {actor.uid}\n")
)
pdb.set_trace(
# start 2 levels up in user code
frame=sys._getframe().f_back.f_back,
)
else:
# we entered the global ``breakpoint()`` built-in from sync code
global _in_debug, _pdb_release_hook
_in_debug = 'sync'
def nuttin():
pass
_pdb_release_hook = nuttin
pdb.set_trace(
# start 2 levels up in user code
frame=sys._getframe().f_back,
)
breakpoint = partial( breakpoint = partial(

View File

@ -64,8 +64,7 @@ def _trio_main(
# we don't need it thanks to our cancellation machinery. # we don't need it thanks to our cancellation machinery.
signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGINT, signal.SIG_IGN)
# TODO: make a global func to set this or is it too hacky? log.info(f"Started new trio process for {actor.uid}")
# os.environ['PYTHONBREAKPOINT'] = 'tractor._debug.breakpoint'
if actor.loglevel is not None: if actor.loglevel is not None:
log.info( log.info(

View File

@ -4,6 +4,7 @@ Root actor runtime ignition(s).
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from functools import partial from functools import partial
import importlib import importlib
import os
from typing import Tuple, Optional, List, Any from typing import Tuple, Optional, List, Any
import typing import typing
import warnings import warnings
@ -55,6 +56,11 @@ async def open_root_actor(
"""Async entry point for ``tractor``. """Async entry point for ``tractor``.
""" """
# Override the global debugger hook to make it play nice with
# ``trio``, see:
# https://github.com/python-trio/trio/issues/1155#issuecomment-742964018
os.environ['PYTHONBREAKPOINT'] = 'tractor._debug._set_trace'
# mark top most level process as root actor # mark top most level process as root actor
_state._runtime_vars['_is_root'] = True _state._runtime_vars['_is_root'] = True