Skip to content

Commit

Permalink
Support sync code breakpointing via built-in
Browse files Browse the repository at this point in the history
Override `breakpoint()` for sync code making it work
properly with `trio` as per:

python-trio/trio#1155 (comment)

Relates to #193
  • Loading branch information
goodboy committed Feb 16, 2021
1 parent 45ef808 commit b1cdca5
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 10 deletions.
31 changes: 24 additions & 7 deletions tractor/_debug.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,14 +275,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(
Expand Down
3 changes: 0 additions & 3 deletions tractor/_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,6 @@ 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:
Expand Down
6 changes: 6 additions & 0 deletions tractor/_root.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from contextlib import asynccontextmanager
from functools import partial
import importlib
import os
from typing import Tuple, Optional, List, Any
import typing
import warnings
Expand Down Expand Up @@ -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

Expand Down

0 comments on commit b1cdca5

Please sign in to comment.