|  | // run | 
|  |  | 
|  | // Copyright 2014 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "runtime" | 
|  | "time" | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | c := make(chan bool, 1) | 
|  | go f1(c) | 
|  | <-c | 
|  | time.Sleep(10 * time.Millisecond) | 
|  | go f2(c) | 
|  | <-c | 
|  | } | 
|  |  | 
|  | func f1(done chan bool) { | 
|  | defer func() { | 
|  | recover() | 
|  | done <- true | 
|  | runtime.Goexit() // left stack-allocated Panic struct on gp->panic stack | 
|  | }() | 
|  | panic("p") | 
|  | } | 
|  |  | 
|  | func f2(done chan bool) { | 
|  | defer func() { | 
|  | recover() | 
|  | done <- true | 
|  | runtime.Goexit() | 
|  | }() | 
|  | time.Sleep(10 * time.Millisecond) // overwrote Panic struct with Timer struct | 
|  | runtime.GC()                      // walked gp->panic list, found mangled Panic struct, crashed | 
|  | panic("p") | 
|  | } |