-
-
Notifications
You must be signed in to change notification settings - Fork 42
Description
I encountered this panic, running gotraceui from source at 40a0e49, using Go 1.25.2 for both running gotraceui and for producing my application's trace:
$ go run ./cmd/gotraceui/ /tmp/x.trace
# honnef.co/go/gotraceui/cmd/gotraceui
ld: warning: ignoring duplicate libraries: '-lobjc'
panic: runtime error: index out of range [-1]
goroutine 12 [running]:
honnef.co/go/gotraceui/trace/ptrace.processEvents(0x140000d2100, 0x1400061c000, 0x14000038908?)
.../go/src/honnef.co/go/gotraceui/trace/ptrace/ptrace.go:661 +0x4d08
honnef.co/go/gotraceui/trace/ptrace.Parse(0x140000d2100, 0x140000100c0)
.../go/src/honnef.co/go/gotraceui/trace/ptrace/ptrace.go:415 +0x1e0
main.loadTrace({_, _}, {_, _}, _)
.../go/src/honnef.co/go/gotraceui/cmd/gotraceui/main.go:1490 +0x14c
main.(*MainWindow).OpenTrace(0x140000f9b08, {0x101122338, 0x14000148080})
.../go/src/honnef.co/go/gotraceui/cmd/gotraceui/main.go:378 +0xd0
main.openTraceFromCmdline.func1()
.../go/src/honnef.co/go/gotraceui/cmd/gotraceui/main.go:1299 +0x50
created by main.openTraceFromCmdline in goroutine 1
.../go/src/honnef.co/go/gotraceui/cmd/gotraceui/main.go:1297 +0x19c
exit status 2
I was able to reproduce the troublesome trace it a couple times in a row with the particular benchmark I was developing, but then I tried changing a couple things, and then I was no longer able to generate an invalid trace.
I'm attaching a copy of the failed trace. I've redacted most of the strings related to the application, by overwriting application-specific strings with the same number of x characters (as in, the redacted file size is identical to the original).
I was able to open the trace in gotraceui again by applying this change:
diff --git a/trace/ptrace/ptrace.go b/trace/ptrace/ptrace.go
index 2d59937..e1c5c50 100644
--- a/trace/ptrace/ptrace.go
+++ b/trace/ptrace/ptrace.go
@@ -658,6 +658,9 @@ func processEvents(r *exptrace.Reader, tr *Trace, progress func(float64)) error
case rangeScopeUnknown:
continue
case rangeScopeGC:
+ if len(tr.GC) == 0 {
+ continue
+ }
prev = &tr.GC[len(tr.GC)-1]
case rangeScopeSTW:
prev = &tr.STW[len(tr.STW)-1]But I don't know if that is actually an appropriate fix, nor do I know enough about trace internals to say what's actually going on here.