...
Source file src/runtime/signal_sighandler.go
1
2
3
4
5
6
7 package runtime
8
9 import (
10 "unsafe"
11 )
12
13
14
15 var crashing int32
16
17
18
19
20 var testSigtrap func(info *siginfo, ctxt *sigctxt, gp *g) bool
21
22
23
24
25
26
27
28
29
30
31
32
33 func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
34 _g_ := getg()
35 c := &sigctxt{info, ctxt}
36
37 if sig == _SIGPROF {
38 sigprof(c.sigpc(), c.sigsp(), c.siglr(), gp, _g_.m)
39 return
40 }
41
42 if sig == _SIGTRAP && testSigtrap != nil && testSigtrap(info, (*sigctxt)(noescape(unsafe.Pointer(c))), gp) {
43 return
44 }
45
46 flags := int32(_SigThrow)
47 if sig < uint32(len(sigtable)) {
48 flags = sigtable[sig].flags
49 }
50 if flags&_SigPanic != 0 && gp.throwsplit {
51
52
53 flags = (flags &^ _SigPanic) | _SigThrow
54 }
55 if isAbortPC(c.sigpc()) {
56
57
58 flags = _SigThrow
59 }
60 if c.sigcode() != _SI_USER && flags&_SigPanic != 0 {
61
62
63
64
65
66
67
68
69 gp.sig = sig
70 gp.sigcode0 = uintptr(c.sigcode())
71 gp.sigcode1 = uintptr(c.fault())
72 gp.sigpc = c.sigpc()
73
74 c.preparePanic(sig, gp)
75 return
76 }
77
78 if c.sigcode() == _SI_USER || flags&_SigNotify != 0 {
79 if sigsend(sig) {
80 return
81 }
82 }
83
84 if c.sigcode() == _SI_USER && signal_ignored(sig) {
85 return
86 }
87
88 if flags&_SigKill != 0 {
89 dieFromSignal(sig)
90 }
91
92 if flags&_SigThrow == 0 {
93 return
94 }
95
96 _g_.m.throwing = 1
97 _g_.m.caughtsig.set(gp)
98
99 if crashing == 0 {
100 startpanic_m()
101 }
102
103 if sig < uint32(len(sigtable)) {
104 print(sigtable[sig].name, "\n")
105 } else {
106 print("Signal ", sig, "\n")
107 }
108
109 print("PC=", hex(c.sigpc()), " m=", _g_.m.id, " sigcode=", c.sigcode(), "\n")
110 if _g_.m.lockedg != 0 && _g_.m.ncgo > 0 && gp == _g_.m.g0 {
111 print("signal arrived during cgo execution\n")
112 gp = _g_.m.lockedg.ptr()
113 }
114 print("\n")
115
116 level, _, docrash := gotraceback()
117 if level > 0 {
118 goroutineheader(gp)
119 tracebacktrap(c.sigpc(), c.sigsp(), c.siglr(), gp)
120 if crashing > 0 && gp != _g_.m.curg && _g_.m.curg != nil && readgstatus(_g_.m.curg)&^_Gscan == _Grunning {
121
122 goroutineheader(_g_.m.curg)
123 traceback(^uintptr(0), ^uintptr(0), 0, _g_.m.curg)
124 } else if crashing == 0 {
125 tracebackothers(gp)
126 print("\n")
127 }
128 dumpregs(c)
129 }
130
131 if docrash {
132 crashing++
133 if crashing < mcount()-int32(extraMCount) {
134
135
136
137
138
139
140
141
142
143
144 print("\n-----\n\n")
145 raiseproc(_SIGQUIT)
146 usleep(5 * 1000 * 1000)
147 }
148 crash()
149 }
150
151 printDebugLog()
152
153 exit(2)
154 }
155
View as plain text