]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add dlog.hexdump
authorAustin Clements <austin@google.com>
Tue, 10 Jun 2025 23:19:34 +0000 (19:19 -0400)
committerGopher Robot <gobot@golang.org>
Tue, 18 Nov 2025 19:46:42 +0000 (11:46 -0800)
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>

src/runtime/debuglog.go

index e993e396c14e9fb8cc151a7723ec0ee73a8c8c84..405f2455c6933ac3b2ee4ff817c4e197fa544169 100644 (file)
@@ -196,7 +196,8 @@ const (
        debugLogPtr
        debugLogString
        debugLogConstString
-       debugLogStringOverflow
+       debugLogHexdump
+       debugLogOverflow
 
        debugLogPC
        debugLogTraceback
@@ -365,13 +366,39 @@ func (l *dloggerImpl) s(x string) *dloggerImpl {
                l.w.uvarint(uint64(len(b)))
                l.w.bytes(b)
                if len(b) != len(x) {
-                       l.w.byte(debugLogStringOverflow)
+                       l.w.byte(debugLogOverflow)
                        l.w.uvarint(uint64(len(x) - len(b)))
                }
        }
        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
 func (l dloggerFake) pc(x uintptr) dloggerFake { return l }
 
@@ -708,9 +735,30 @@ func (r *debugLogReader) printVal() bool {
                s := *(*string)(unsafe.Pointer(&str))
                print(s)
 
-       case debugLogStringOverflow:
+       case debugLogOverflow:
                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:
                printDebugLogPC(uintptr(r.uvarint()), false)