Fix random crashes - embedding py/w PyObject pointers to app data.
Hi, just spent a couple of hours looking into a bug that others might also have. If your app embeds python, and allows scripts to throw exceptions while the application keeps running you may also have this problem.
sys.last_traceback will store the last exception along with the namespace dictionary of the script that just ran (with all its functions etc, variables etc).
In our case this caused crashes because you could load in new data, making many of the PyObjects referenced from sys.last_traceback, point to invalid data. Once sys.last_traceback was set again it would free the existing data sometimes touching pointers with invalid addresses causing a segfault.
Simple solution is to run this after PyErr_Print();
PySys_SetObject( "last_traceback", Py_None);
This can also free memory, if large datasets are references from the traceback. maybe some of your would fine this useful.
--
- Campbell
On Tue, Oct 21, 2008 at 9:34 PM, Campbell Barton <ideasman42@gmail.com> wrote:
Hi, just spent a couple of hours looking into a bug that others might also have. If your app embeds python, and allows scripts to throw exceptions while the application keeps running you may also have this problem.
sys.last_traceback will store the last exception along with the namespace dictionary of the script that just ran (with all its functions etc, variables etc).
In our case this caused crashes because you could load in new data, making many of the PyObjects referenced from sys.last_traceback, point to invalid data. Once sys.last_traceback was set again it would free the existing data sometimes touching pointers with invalid addresses causing a segfault.
Simple solution is to run this after PyErr_Print();
PySys_SetObject( "last_traceback", Py_None);
This can also free memory, if large datasets are references from the traceback. maybe some of your would fine this useful.
Do you mean you have a PyObject with a pointer to malloc'd memory, and after the exception is handled (but not cleared) you free the malloc'd memory, but leave the PyObject with a pointer to it? If so you should be keeping track of any PyObjects and clearing them instead (or let them take care of freeing the malloc'd memory).
-- Adam Olsen, aka Rhamphoryncus
participants (2)
-
Adam Olsen
-
Campbell Barton