Improve traceability of assertion errors in common functions
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 request
(By @picnizx)
While the C API docs explicitly state that functions should usually not be called with an exception set, else some assertion errors may occur and/or the thread state may be invalid, this means that assert(!PyErr_Occurred()) in common macros / functions such as _PyType_LookupRef would just crash. However, in a CI scenario, without a debugger, it's extremely hard to pinpoint the actual cause.
Related: https://github.com/python/cpython/pull/128159 would give the possibility to show the C stack trace with -X faulthandler.
A crude idea: add assert(!PyErr_Occurred()) inside public common C API functions to be sure that the assertion is checked as well, making debugging a bit easier.
Toy Scenario (original request):
I was working on freethread support for pygame-ce, and I finally need to use a python build with debug symbols, and our atexit-registered quit function was causing SIGABRT to be thrown. This took me a while to figure out. Here's all the code you need to run (or just run python -c "import pygame" since pygame.quit() is atexit-registered).
import pygame
pygame.quit()
Here's the guilty block of code in our codebase:
funcobj = PyObject_GetAttrString(module, "_internal_mod_quit");
/* If we could not load _internal_mod_quit, load quit function */
if (!funcobj)
funcobj = PyObject_GetAttrString(module, "quit");
/* Silence errors */
if (PyErr_Occurred())
PyErr_Clear();
In the 3.12 docs for PyObject_GetAttrString and PyObject_GetAttr. there's no mention at all that there shouldn't be any exceptions set before calling this function, and it works on release versions of python, so nobody has ever questioned this structure. I'll be making a pull request on our end to clear any exceptions between the first call and second call if needed (or use PyObject_GetOptionalAttrString in 3.13+).
The reason for this issue is that I'm not sure throwing a SIGABRT is the best option here.
gdb backtrace on a debug python 3.13t
[gdb.txt](https://github.com/user-attachments/files/18922524/gdb.txt)
CPython versions tested on:
3.12, 3.13, 3.14
Operating systems tested on:
Linux
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 examiner le comportement de la C API autour de PyObject_GetAttrString, PyObject_GetAttr, PyErr_Occurred et _PyType_LookupRef, ainsi que la pull request faulthandler associée. Comparez les préconditions documentées avec les échecs d’assertion présentés dans le scénario pygame. La tâche est considérée comme terminée lorsqu’une approche convenue pour améliorer la traçabilité des assertions et son comportement attendu est établie.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, python
- Domaine
- api
- Type d'issue
- Fonctionnalité
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 45/100