runtime: add dlog.hexdump

Change-Id: I8149ab9314216bb8f9bf58da55633e2587d75851
Reviewed-on: https://go-review.googlesource.com/c/go/+/681376
Auto-Submit: Austin Clements <austin@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Austin Clements 2025-06-10 19:19:34 -04:00 committed by Gopher Robot
parent e912618bd2
commit 8c41a482f9

View file

@ -196,7 +196,8 @@ const (
debugLogPtr debugLogPtr
debugLogString debugLogString
debugLogConstString debugLogConstString
debugLogStringOverflow debugLogHexdump
debugLogOverflow
debugLogPC debugLogPC
debugLogTraceback debugLogTraceback
@ -365,13 +366,39 @@ func (l *dloggerImpl) s(x string) *dloggerImpl {
l.w.uvarint(uint64(len(b))) l.w.uvarint(uint64(len(b)))
l.w.bytes(b) l.w.bytes(b)
if len(b) != len(x) { if len(b) != len(x) {
l.w.byte(debugLogStringOverflow) l.w.byte(debugLogOverflow)
l.w.uvarint(uint64(len(x) - len(b))) l.w.uvarint(uint64(len(x) - len(b)))
} }
} }
return l return l
} }
//go:nosplit
func (l dloggerFake) hexdump(p unsafe.Pointer, bytes uintptr) dloggerFake { return l }
//go:nosplit
func (l *dloggerImpl) hexdump(p unsafe.Pointer, bytes uintptr) *dloggerImpl {
var b []byte
bb := (*slice)(unsafe.Pointer(&b))
bb.array = unsafe.Pointer(p)
bb.len, bb.cap = int(bytes), int(bytes)
if len(b) > debugLogStringLimit {
b = b[:debugLogStringLimit]
}
l.w.byte(debugLogHexdump)
l.w.uvarint(uint64(uintptr(p)))
l.w.uvarint(uint64(len(b)))
l.w.bytes(b)
if uintptr(len(b)) != bytes {
l.w.byte(debugLogOverflow)
l.w.uvarint(uint64(bytes) - uint64(len(b)))
}
return l
}
//go:nosplit //go:nosplit
func (l dloggerFake) pc(x uintptr) dloggerFake { return l } func (l dloggerFake) pc(x uintptr) dloggerFake { return l }
@ -708,9 +735,30 @@ func (r *debugLogReader) printVal() bool {
s := *(*string)(unsafe.Pointer(&str)) s := *(*string)(unsafe.Pointer(&str))
print(s) print(s)
case debugLogStringOverflow: case debugLogOverflow:
print("..(", r.uvarint(), " more bytes)..") print("..(", r.uvarint(), " more bytes)..")
case debugLogHexdump:
p := uintptr(r.uvarint())
bl := r.uvarint()
if r.begin+bl > r.end {
r.begin = r.end
print("<hexdump length corrupted>")
break
}
println() // Start on a new line
hd := hexdumper{addr: p}
for bl > 0 {
b := r.data.b[r.begin%uint64(len(r.data.b)):]
if uint64(len(b)) > bl {
b = b[:bl]
}
r.begin += uint64(len(b))
bl -= uint64(len(b))
hd.write(b)
}
hd.close()
case debugLogPC: case debugLogPC:
printDebugLogPC(uintptr(r.uvarint()), false) printDebugLogPC(uintptr(r.uvarint()), false)