mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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:
parent
e912618bd2
commit
8c41a482f9
1 changed files with 51 additions and 3 deletions
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue