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
def _set_trace(actor):
log.runtime(f"\nAttaching pdb to actor: {actor.uid}\n")
def _set_trace(actor=None):
pdb = _mk_pdb()
pdb.set_trace(
# start 2 levels up in user code
frame=sys._getframe().f_back.f_back,
)
if actor is not None:
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(

View File

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

View File

@ -4,6 +4,7 @@ Root actor runtime ignition(s).
from contextlib import asynccontextmanager
from functools import partial
import importlib
import os
from typing import Tuple, Optional, List, Any
import typing
import warnings
@ -55,6 +56,11 @@ async def open_root_actor(
"""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
_state._runtime_vars['_is_root'] = True