Source file
src/runtime/print.go
1
2
3
4
5 package runtime
6
7 import (
8 "internal/goarch"
9 "internal/strconv"
10 "unsafe"
11 )
12
13
14
15 type hex uint64
16
17 func bytes(s string) (ret []byte) {
18 rp := (*slice)(unsafe.Pointer(&ret))
19 sp := stringStructOf(&s)
20 rp.array = sp.str
21 rp.len = sp.len
22 rp.cap = sp.len
23 return
24 }
25
26 var (
27
28
29 printBacklog [512]byte
30 printBacklogIndex int
31 )
32
33
34
35
36
37
38
39
40 func recordForPanic(b []byte) {
41 printlock()
42
43 if panicking.Load() == 0 {
44
45 for i := 0; i < len(b); {
46 n := copy(printBacklog[printBacklogIndex:], b[i:])
47 i += n
48 printBacklogIndex += n
49 printBacklogIndex %= len(printBacklog)
50 }
51 }
52
53 printunlock()
54 }
55
56 var debuglock mutex
57
58
59
60
61
62
63
64
65
66 func printlock() {
67 mp := getg().m
68 mp.locks++
69 mp.printlock++
70 if mp.printlock == 1 {
71 lock(&debuglock)
72 }
73 mp.locks--
74 }
75
76 func printunlock() {
77 mp := getg().m
78 mp.printlock--
79 if mp.printlock == 0 {
80 unlock(&debuglock)
81 }
82 }
83
84
85
86 func gwrite(b []byte) {
87 if len(b) == 0 {
88 return
89 }
90 recordForPanic(b)
91 gp := getg()
92
93
94
95
96
97 if gp == nil || gp.writebuf == nil || gp.m.dying > 0 {
98 writeErr(b)
99 return
100 }
101
102 n := copy(gp.writebuf[len(gp.writebuf):cap(gp.writebuf)], b)
103 gp.writebuf = gp.writebuf[:len(gp.writebuf)+n]
104 }
105
106 func printsp() {
107 printstring(" ")
108 }
109
110 func printnl() {
111 printstring("\n")
112 }
113
114 func printbool(v bool) {
115 if v {
116 printstring("true")
117 } else {
118 printstring("false")
119 }
120 }
121
122 func printfloat64(v float64) {
123 var buf [20]byte
124 gwrite(strconv.AppendFloat(buf[:0], v, 'g', -1, 64))
125 }
126
127 func printfloat32(v float32) {
128 var buf [20]byte
129 gwrite(strconv.AppendFloat(buf[:0], float64(v), 'g', -1, 32))
130 }
131
132 func printcomplex128(c complex128) {
133 var buf [44]byte
134 gwrite(strconv.AppendComplex(buf[:0], c, 'g', -1, 128))
135 }
136
137 func printcomplex64(c complex64) {
138 var buf [44]byte
139 gwrite(strconv.AppendComplex(buf[:0], complex128(c), 'g', -1, 64))
140 }
141
142 func printuint(v uint64) {
143
144
145
146
147 var buf [20]byte
148 i := strconv.RuntimeFormatBase10(buf[:], v)
149 gwrite(buf[i:])
150 }
151
152 func printint(v int64) {
153
154
155
156
157 neg := v < 0
158 u := uint64(v)
159 if neg {
160 u = -u
161 }
162 var buf [20]byte
163 i := strconv.RuntimeFormatBase10(buf[:], u)
164 if neg {
165 i--
166 buf[i] = '-'
167 }
168 gwrite(buf[i:])
169 }
170
171 var minhexdigits = 0
172
173 func printhex(v uint64) {
174 const dig = "0123456789abcdef"
175 var buf [100]byte
176 i := len(buf)
177 for i--; i > 0; i-- {
178 buf[i] = dig[v%16]
179 if v < 16 && len(buf)-i >= minhexdigits {
180 break
181 }
182 v /= 16
183 }
184 i--
185 buf[i] = 'x'
186 i--
187 buf[i] = '0'
188 gwrite(buf[i:])
189 }
190
191 func printpointer(p unsafe.Pointer) {
192 printhex(uint64(uintptr(p)))
193 }
194 func printuintptr(p uintptr) {
195 printhex(uint64(p))
196 }
197
198 func printstring(s string) {
199 gwrite(bytes(s))
200 }
201
202 func printslice(s []byte) {
203 sp := (*slice)(unsafe.Pointer(&s))
204 print("[", len(s), "/", cap(s), "]")
205 printpointer(sp.array)
206 }
207
208 func printeface(e eface) {
209 print("(", e._type, ",", e.data, ")")
210 }
211
212 func printiface(i iface) {
213 print("(", i.tab, ",", i.data, ")")
214 }
215
216
217
218
219
220
221 func hexdumpWords(p, end uintptr, mark func(uintptr) byte) {
222 printlock()
223 var markbuf [1]byte
224 markbuf[0] = ' '
225 minhexdigits = int(unsafe.Sizeof(uintptr(0)) * 2)
226 for i := uintptr(0); p+i < end; i += goarch.PtrSize {
227 if i%16 == 0 {
228 if i != 0 {
229 println()
230 }
231 print(hex(p+i), ": ")
232 }
233
234 if mark != nil {
235 markbuf[0] = mark(p + i)
236 if markbuf[0] == 0 {
237 markbuf[0] = ' '
238 }
239 }
240 gwrite(markbuf[:])
241 val := *(*uintptr)(unsafe.Pointer(p + i))
242 print(hex(val))
243 print(" ")
244
245
246 fn := findfunc(val)
247 if fn.valid() {
248 print("<", funcname(fn), "+", hex(val-fn.entry()), "> ")
249 }
250 }
251 minhexdigits = 0
252 println()
253 printunlock()
254 }
255
View as plain text