1
2
3
4
5 package main
6
7 import (
8 "fmt"
9 "runtime"
10 )
11
12 func init() {
13 register("GCPanicFramePointer", GCPanicFramePointer)
14 }
15
16 type panicFrameBig struct {
17 p *[4]int
18 pad [32]int
19 }
20
21 var (
22 panicFrameSink *[4]int
23 panicFrameValue int
24 )
25
26
27 func panicFrameUse(p *[4]int) { panicFrameValue = p[0] }
28
29
30 func panicFrameCall(fn func()) { fn() }
31
32
33
34
35
36
37
38
39
40 func panicFrameF(w panicFrameBig) {
41 defer func() {
42 runtime.GC()
43 runtime.GC()
44 }()
45 panicFrameCall(func() { panicFrameUse(w.p) })
46 panicFrameSink = nil
47 runtime.GC()
48 runtime.GC()
49 runtime.Goexit()
50 }
51
52 func GCPanicFramePointer() {
53 for i := 0; i < 200; i++ {
54 done := make(chan struct{})
55 go func() {
56
57
58
59
60
61 defer func() {
62 runtime.GC()
63 runtime.GC()
64 close(done)
65 }()
66 p := new([4]int)
67 p[0] = i
68 panicFrameSink = p
69 panicFrameF(panicFrameBig{p: p})
70 }()
71 <-done
72 }
73 fmt.Println("OK")
74 }
75
View as plain text