[Piglit] [Patch RFC] Piglit Segmentation Handler

Jose Fonseca jfonseca at vmware.com
Tue Feb 19 23:36:56 PST 2013


----- Original Message -----
> On Mon, Feb 18, 2013 at 10:40 AM, Jose Fonseca <jfonseca at vmware.com> wrote:
> > I think this is a great idea.
> >
> > Concerning Windows, I don't have time to test myself now, but FWIW, feel
> > free to lift inspiration/code from apitrace's exception handler:
> > https://github.com/apitrace/apitrace/blob/master/common/os_win32.cpp#L248
> > I know it works very well.
> >
> 
> I did find some of that useful. I also see that I probably *should*
> add a function to remove the handlers for the cases when a particular
> host system does not support automatically reverting things to default
> state. However, From what I can see, Windows automatically uses
> default handlers.

apitrace needs to be particularly careful to avoid interfereing with apps' exception handlers, but here piglit is the main app, and I don't think we rely on signals anywhere, so it probably doesn't matter.

> > However this is not enough to make piglit on windows 100% handsfree --
> > because assertion failures / errors on windows often create an interactive
> > dialog box, the only way to be 100% sure the test won't hang is to have
> > the piglit python framework periodically search for dialog boxes...
> >
> > Jose
> >
> 
> SetErrorMode is what you use to simply enable/disable error
> Functionality. SEM_NOGPFAULTERRORBOX is the exact flag that needs to
> be used to disable the crash dialog.

This helps, many system error messages honor that. But I believe that MSVCRT assertion failures and some other error messages can still pop up.

> As for other things, the best way to capture crash backtraces that I
> can find is to use the AddVectoredExceptionHandler ( and
> RemoveVectoredExceptionHandler ) functions over the other functions (
> SetUnhandledExceptionFilter, Signal, and _set_se_translator ). That
> said, Currently I only have backtraces generated for the following
> exceptions...
> 
> EXCEPTION_FLT_DIVIDE_BY_ZERO
> EXCEPTION_INT_DIVIDE_BY_ZERO
> EXCEPTION_ACCESS_VIOLATION

Well, in this case (unlike apitrace), we known we are the only exception handler, so my understanding is that any exception will be fatal.

> That said, Here's some of the documentation I'm using to figure out
> what exceptions to handle/use...


> MSDN - EXCEPTION_RECORD Structure
> http://msdn.microsoft.com/en-us/library/windows/desktop/aa363082%28v=vs.85%29.aspx
> 
> 
> MSDN - SetErrorMode documentation
> http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx
> 
> MSDN - AddVectoredExceptionHandler
> http://msdn.microsoft.com/en-us/library/windows/desktop/ms679274%28v=vs.85%29.aspx
> MSDN - RemoveVectoredExceptionHandler
> http://msdn.microsoft.com/en-us/library/windows/desktop/ms680571%28v=vs.85%29.aspx
> 
> As for backtracing, I am using SymFromAddr, SymGetLineFromAddr64, and
> SymInitialize from dbghelp (
> http://msdn.microsoft.com/en-us/library/windows/desktop/ms679309%28v=vs.85%29.aspx
> ), and CaptureStackBackTrace (
> http://msdn.microsoft.com/en-us/library/windows/desktop/bb204633%28v=vs.85%29.aspx
> )

Note that dbgjelp.dll is not bundled with Windows. I'm not sure what are the redistrbutions conditions. We might want to dynamically link in runtime, to avoid introducing a dependency.

This might also interest you:

  http://code.google.com/p/google-breakpad/

> NOTE: I have not yet tested the backtrace capture on a real driver
> with windows, but with an in-program crash the capture works well
> enough to guarantee that piglit will get a "Crash" result and
> backtrace before the program closes out

This is already a nice improvement.

Jose


More information about the Piglit mailing list