Hey, Alan. I'm relatively new to Go, and faced a similar issue - I writing tests for a legacy codebase and want to fail the test if the tested code panics somewhere inside. Almost ten years passed - did you find or create a solution?
On Tuesday, June 17, 2014 at 6:01:49 AM UTC+3 Alan Shreve wrote: > I’d like to do crash-reporting for programs that run in environments I > don’t control (e.g. your laptop). The behavior I want is similar to what > many production-grade desktop applications do when they crash: capture > process state information, optionally prompt the user for permission, and > send the crash report to a secure server. > > How one would implement such a function for Go programs is tricky without > cooperation from the runtime. The options I’m considering: > > 1. The strawman is to wrap every goroutine that I spawn with a function > that defers and calls the panic handler. It would have no effect on third > party libraries which spawn goroutines (or the standard library) which > makes it pretty much a non-starter. It’s also extremely onerous and > unidiomatic to write all of your code this way. > > 2. Automate the above behavior by parsing all of the Go code (including > 3rd party libs) to rewrite all statements which spawn goroutines to wrap > each goroutine with a panic handler. It’s messy, adds another stage to my > build process, but could work well for all of my code and 3rd party code > and possibly for the > > 3. Set GOTRACEBACK=crash and then use the operating-system native > interfaces to recover the state of the program. This is a lot of work. This > interface is defined differently on each OS. Recovering the state from > these crash handlers would be challenging because it would happen outside > the runtime and the existing tools for this like google’s breakpad are > built for C applications. A minor point, but also GOTRACEBACK=crash isn’t > implemented on some OS’s yet (notably Windows). > > 4. Fork immediately after startup and use the parent process to monitor > the child for exit code 2 and a panic traceback on stderr. This is the > approach taken by panicwrap[0] which is known to work, but has two issues. > Dealing with signals becomes especially tricky. Any number of supervisor > programs and system administration tools rely on sending signals to > manipulate processes in production. The crash-handling parent process would > need to handle these signals appropriately. Should it forward them to the > children? Or rely on the signaling process to signal the whole process > tree? Signal handling behavior is not consistent across platforms, which > makes this difficult to get right. For example, Windows apparently sends > CTRL+BREAK to the whole tree, but not CTRL+C. As a final point, this > approach also fails on systems that disallow spawning additional processes > (NaCl, maybe AppEngine, I’m unsure). > > 5. Fork immediately after startup and dup stderr through to the child > process. This avoids all of the signal handling conundrums of approach #4 > but does mean that you can no longer check the exit status of the program > and would have to fall back just to looking for the ‘panic:’ header only. > Still doesn’t work if you can’t spawn processes. > > 6. I’d like to modify the Go runtime to simply add an API which allows a > developer to intercept runtime panics and choose how to handle them. > Ideally, I would like to do this with an API like: > > runtime.OnPanic(func(state *ProcessState) { > // send to crash report server > }) > > I’d even settle for: > > runtime.OnPanic(func () { > // send to crash report server > runtime.Stack() > }) > > What is the best option among these? Would this be an API the Go team > would consider adding to the language? > > [0] github.com/mitchellh/panicwrap -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/e38ab602-ccf9-426f-b539-31ade944a363n%40googlegroups.com.