Use our `._post_mortem` from `open_crash_handler()`

Since it seems that `pdbp.xpm()` can sometimes lose the up-stack
traceback info/frames? Not sure why but ours seems to work just fine
from a `asyncio`-handler in `modden`'s use of `i3ipc` B)

Also call `DebugStatus.shield_sigint()` from `pause_from_sync()` in the
infected-`asyncio` case to get the same shielding behaviour as in all
other usage!
aio_abandons
Tyler Goodlet 2024-07-29 17:56:00 -04:00
parent 110a023a03
commit 3b39cce741
1 changed files with 15 additions and 7 deletions

View File

@ -2491,10 +2491,7 @@ def pause_from_sync(
message += ( message += (
f'-> called from a root-actor bg {thread}\n' f'-> called from a root-actor bg {thread}\n'
) )
elif is_aio:
message += (
f'-> called from a `asyncio`-task bg {thread}\n'
)
message += ( message += (
'-> scheduling `._pause_from_bg_root_thread()`..\n' '-> scheduling `._pause_from_bg_root_thread()`..\n'
) )
@ -2551,6 +2548,7 @@ def pause_from_sync(
elif is_aio: elif is_aio:
greenback: ModuleType = maybe_import_greenback() greenback: ModuleType = maybe_import_greenback()
repl_owner: Task = asyncio.current_task() repl_owner: Task = asyncio.current_task()
DebugStatus.shield_sigint()
fute: asyncio.Future = run_trio_task_in_future( fute: asyncio.Future = run_trio_task_in_future(
partial( partial(
_pause, _pause,
@ -2566,6 +2564,7 @@ def pause_from_sync(
**_pause_kwargs **_pause_kwargs
) )
) )
# TODO: for async version -> `.pause_from_aio()`? # TODO: for async version -> `.pause_from_aio()`?
# bg_task, _ = await fute # bg_task, _ = await fute
bg_task, _ = greenback.await_(fute) bg_task, _ = greenback.await_(fute)
@ -2700,8 +2699,7 @@ _crash_msg: str = (
def _post_mortem( def _post_mortem(
# provided and passed by `_pause()` repl: PdbREPL, # normally passed by `_pause()`
repl: PdbREPL,
# XXX all `partial`-ed in by `post_mortem()` below! # XXX all `partial`-ed in by `post_mortem()` below!
tb: TracebackType, tb: TracebackType,
@ -3018,7 +3016,17 @@ def open_crash_handler(
yield yield
except tuple(catch) as err: except tuple(catch) as err:
if type(err) not in ignore: if type(err) not in ignore:
pdbp.xpm()
# use our re-impl-ed version
_post_mortem(
repl=mk_pdb(),
tb=sys.exc_info()[2],
api_frame=inspect.currentframe().f_back,
)
# XXX NOTE, `pdbp`'s version seems to lose the up-stack
# tb-info?
# pdbp.xpm()
raise raise