Make the `PY_UNWIND` monitoring event local
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Feature or enhancement
Proposal:
I would like to propose making the PY_UNWIND monitoring event available as a local event. The rationale for doing this is that some tools can be interested in trapping per-function exit events. Currently, this is only possible with the PY_RETURN event when a function returns with a value. However, if a function is exited with an exception, there is no way of capturing that event on just that function. Making the PY_UNWIND event would allow monitoring tools to catch all function exit events.
import random, sys
m, e = sys.monitoring, sys.monitoring.events
m.use_tool_id(0, "debugger")
def monitor(event):
def _(f):
m.register_callback(0, event, f)
return _
@monitor(e.PY_START)
def _(*_, **__):
print("entering", sys._getframe(1))
@monitor(e.PY_UNWIND)
def _(*_, **__):
print("exiting ", sys._getframe(1), "with exception")
def foo():
raise RuntimeError()
def bar():
return foo()
def baz():
return bar()
m.set_local_events(0, random.choice([foo, bar, baz]).__code__, e.PY_UNWIND | e.PY_START)
try:
baz()
except Exception:
pass
# entering <frame at 0x101602f80, file 'test_py_unwind_local.py', line 34, code baz>
# exiting <frame at 0x101602f80, file 'test_py_unwind_local.py', line 35, code baz> with exception
A debugger is an example of a tool that can benefit from PY_UNWIND being a local event.
The proposed change will break the current assumption that local events always require bytecode instrumentation. Instead, the PY_UNWIND event will simply make a local tool check instead of a global one inside monitor_unwind. No changes to bytecode or any other parts are required.
This is an extension of the current implementation of PEP 669 whereby PY_UNWIND will be available as a local event. The behaviour of the already existing global event will not be touched. As such, the proposed change will be guaranteed to be backwards-compatible.
Has this already been discussed elsewhere?
I have already discussed this feature proposal on Discourse
Links to previous discussion of this feature:
https://discuss.python.org/t/pep-669-low-impact-monitoring-for-cpython/13018/82
Linked PRs
- gh-142179
- gh-146182
- gh-148955
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par le point d’entrée monitor_unwind mentionné dans la proposition et examinez les PR liés gh-142179, gh-146182 et gh-148955. Vérifiez comment une inscription locale PY_UNWIND est contrôlée tout en préservant le comportement existant des événements globaux ; le travail est terminé lorsque les outils de surveillance peuvent recevoir des événements locaux de sortie de fonction pour l’unwinding.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Fonctionnalité
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100