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