mirror of
https://github.com/golang/go.git
synced 2025-05-30 19:52:53 +00:00
Currently STW events are only emitted for GC STWs. There's little reason why the trace can't contain events for every STW: they're rare so don't take up much space in the trace, yet being able to see when the world was stopped is often critical to debugging certain latency issues, especially when they stem from user-level APIs. This change adds new "kinds" to the EvGCSTWStart event, renames the GCSTW events to just "STW," and lets the parser deal with unknown STW kinds for future backwards compatibility. But, this change must break trace compatibility, so it bumps the trace version to Go 1.21. This change also includes a small cleanup in the trace command, which previously checked for STW events when deciding whether user tasks overlapped with a GC. Looking at the source, I don't see a way for STW events to ever enter the stream that that code looks at, so that condition has been deleted. Change-Id: I9a5dc144092c53e92eb6950e9a5504a790ac00cf Reviewed-on: https://go-review.googlesource.com/c/go/+/494495 Reviewed-by: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Michael Knyszek <mknyszek@google.com>
47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
// Copyright 2019 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.
|
|
|
|
// Export debuglog guts for testing.
|
|
|
|
package runtime
|
|
|
|
const DlogEnabled = dlogEnabled
|
|
|
|
const DebugLogBytes = debugLogBytes
|
|
|
|
const DebugLogStringLimit = debugLogStringLimit
|
|
|
|
var Dlog = dlog
|
|
|
|
func (l *dlogger) End() { l.end() }
|
|
func (l *dlogger) B(x bool) *dlogger { return l.b(x) }
|
|
func (l *dlogger) I(x int) *dlogger { return l.i(x) }
|
|
func (l *dlogger) I16(x int16) *dlogger { return l.i16(x) }
|
|
func (l *dlogger) U64(x uint64) *dlogger { return l.u64(x) }
|
|
func (l *dlogger) Hex(x uint64) *dlogger { return l.hex(x) }
|
|
func (l *dlogger) P(x any) *dlogger { return l.p(x) }
|
|
func (l *dlogger) S(x string) *dlogger { return l.s(x) }
|
|
func (l *dlogger) PC(x uintptr) *dlogger { return l.pc(x) }
|
|
|
|
func DumpDebugLog() string {
|
|
gp := getg()
|
|
gp.writebuf = make([]byte, 0, 1<<20)
|
|
printDebugLog()
|
|
buf := gp.writebuf
|
|
gp.writebuf = nil
|
|
|
|
return string(buf)
|
|
}
|
|
|
|
func ResetDebugLog() {
|
|
stopTheWorld(stwForTestResetDebugLog)
|
|
for l := allDloggers; l != nil; l = l.allLink {
|
|
l.w.write = 0
|
|
l.w.tick, l.w.nano = 0, 0
|
|
l.w.r.begin, l.w.r.end = 0, 0
|
|
l.w.r.tick, l.w.r.nano = 0, 0
|
|
}
|
|
startTheWorld()
|
|
}
|