[C-API] Weird sys.exc_info reference segfault

Jonas H. jonas at lophus.org
Sat Oct 2 17:35:01 EDT 2010


Hello list,

I have a really weird reference problem with `sys.exc_info`, and, if I'm 
right, function frames.

The software in question is bjoern, a WSGI web server written in C, 
which you can find at http://github.com/jonashaag/bjoern.

This WSGI application:

   def app(env, start_response):
       start_response('200 alright', [])
       try:
           a
       except:
           import sys
           sys.exc_info()
       return ['hello']

   import bjoern
   bjoern.run(app, '0.0.0.0', 8080)

works perfect, however, if I make the 7th line an assignment:

   x = sys.exc_info()

I get a segmentation fault after a few requests, the stack trace being:

   #1  frame_clear ()
   #2  collect ()
   #3  _PyObject_GC_Malloc ()
   #4  PyType_GenericAlloc ()
   #5  BaseException_new ()
   #6  type_call ()
   #7  PyObject_Call ()
   #8  PyEval_CallObjectWithKeywords ()
   #9  PyErr_NormalizeException ()
   #10 PyEval_EvalFrameEx ()
   #11 PyEval_EvalCodeEx ()
   #12 function_call ()
   #14 PyObject_CallFunctionObjArgs ()
   #15 wsgi_call_application (request=...) at bjoern/wsgi.c:33

Now that is weird. The only difference between the two functions is that 
the second one (with the assignment) keeps a reference to the exc_info 
tuple in the function frame.
The `PyThreadState_GET()->exc_{type,value,traceback}` values, however, 
should be the same in both cases, because the `except:` cleanup resets 
those to NULL, shouldn't it?

Do you have any tips how to debug this?

Thanks in advance,
Jonas



More information about the Python-list mailing list