Author haypo
Recipients haypo, pitrou
Date 2010-10-12.23:41:38
SpamBayes Score 1.68637e-11
Marked as misclassified No
Message-id <1286926902.27.0.209283522897.issue8863@psf.upfronthosting.co.za>
In-reply-to
Content
New version of the patch:
 - use more standard function names (_Py_initsegfault => _Py_InitSegfault)
 - use "#ifdef HAVE_SIGACTION" to support system without sigaction(): fallback to signal()
 - usage of the alternative stack is now optional (#ifdef HAVE_SIGALTSTACK)
 - don't call _PyUnicode_AsString() (encode unicode to utf-8) because it allocates memory and it does complex operation which may fail: implement a new simple function to write a unicode string to a FILE* object with ascii+backslashreplace
 - display the function name in the backtrace (but don't display function depth)
 - _Py_FiniSegfault(): restore the old signal handlers before freeing the alternative stack memory (and not the opposite)

I only tested the patch on Linux with a narrow build. It should be tested at least on a wide build and on Windows.

I tested my patch on all Lib/test/crashers/*.py: all segfaults are replaced by nice Python tracebacks.

If you debug a Python program in gdb, gdb stops at the first SIGSEGV (before calling the signal handler).

I didn't tested how the signal handler behaves if it raises a new fault (SIGFPE or SIGSEGV). It is supposes to stop immediatly.

In the worst case, my patch introduces an infinite loop and the program eats all CPU time (and consume maybe a lot of memory?) instead of exiting immediatly. Especially, segfault_handler() doesn't ensure that there is no loop in the frame linked list. A possible solution is to fix a limit of the maximum depth (eg. only display first 100 frames and finished with "...").
History
Date User Action Args
2010-10-12 23:41:42hayposetrecipients: + haypo, pitrou
2010-10-12 23:41:42hayposetmessageid: <1286926902.27.0.209283522897.issue8863@psf.upfronthosting.co.za>
2010-10-12 23:41:40haypolinkissue8863 messages
2010-10-12 23:41:39haypocreate