diff --git a/stacktrace.go b/stacktrace.go index 4c288ab72..2f8933ea9 100644 --- a/stacktrace.go +++ b/stacktrace.go @@ -355,9 +355,7 @@ func callerFunctionName() string { // It replicates https://golang.org/pkg/debug/gosym/#Sym.PackageName, avoiding a // dependency on debug/gosym. func packageName(name string) string { - // A prefix of "type." and "go." is a compiler-generated symbol that doesn't belong to any package. - // See variable reservedimports in cmd/compile/internal/gc/subr.go - if strings.HasPrefix(name, "go.") || strings.HasPrefix(name, "type.") { + if isCompilerGeneratedSymbol(name) { return "" } diff --git a/stacktrace_below_go1.20.go b/stacktrace_below_go1.20.go new file mode 100644 index 000000000..f6fb8e1e4 --- /dev/null +++ b/stacktrace_below_go1.20.go @@ -0,0 +1,15 @@ +//go:build !go1.20 + +package sentry + +import "strings" + +func isCompilerGeneratedSymbol(name string) bool { + // In versions of Go below 1.20 a prefix of "type." and "go." is a + // compiler-generated symbol that doesn't belong to any package. + // See variable reservedimports in cmd/compile/internal/gc/subr.go + if strings.HasPrefix(name, "go.") || strings.HasPrefix(name, "type.") { + return true + } + return false +} diff --git a/stacktrace_below_go1.20_test.go b/stacktrace_below_go1.20_test.go new file mode 100644 index 000000000..2f350e3c8 --- /dev/null +++ b/stacktrace_below_go1.20_test.go @@ -0,0 +1,32 @@ +//go:build !go1.20 + +package sentry + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestFilterCompilerGeneratedSymbols(t *testing.T) { + tests := []struct { + symbol string + expectedPackageName string + }{ + {"type..eq.[9]debug/elf.intName", ""}, + {"type..hash.debug/elf.ProgHeader", ""}, + {"type..eq.runtime._panic", ""}, + {"type..hash.struct { runtime.gList; runtime.n int32 }", ""}, + {"go.(*struct { sync.Mutex; math/big.table [64]math/big", ""}, + {"github.com/getsentry/sentry-go.Test.func2.1.1", "github.com/getsentry/sentry-go"}, + } + + for _, tt := range tests { + t.Run(tt.symbol, func(t *testing.T) { + packageName := packageName(tt.symbol) + if diff := cmp.Diff(tt.expectedPackageName, packageName); diff != "" { + t.Errorf("Package name mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/stacktrace_go1.20.go b/stacktrace_go1.20.go new file mode 100644 index 000000000..ff1cbf600 --- /dev/null +++ b/stacktrace_go1.20.go @@ -0,0 +1,15 @@ +//go:build go1.20 + +package sentry + +import "strings" + +func isCompilerGeneratedSymbol(name string) bool { + // In versions of Go 1.20 and above a prefix of "type:" and "go:" is a + // compiler-generated symbol that doesn't belong to any package. + // See variable reservedimports in cmd/compile/internal/gc/subr.go + if strings.HasPrefix(name, "go:") || strings.HasPrefix(name, "type:") { + return true + } + return false +} diff --git a/stacktrace_go1.20_test.go b/stacktrace_go1.20_test.go new file mode 100644 index 000000000..245dbe148 --- /dev/null +++ b/stacktrace_go1.20_test.go @@ -0,0 +1,32 @@ +//go:build go1.20 + +package sentry + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestFilterCompilerGeneratedSymbols(t *testing.T) { + tests := []struct { + symbol string + expectedPackageName string + }{ + {"type:.eq.[9]debug/elf.intName", ""}, + {"type:.hash.debug/elf.ProgHeader", ""}, + {"type:.eq.runtime._panic", ""}, + {"type:.hash.struct { runtime.gList; runtime.n int32 }", ""}, + {"go:(*struct { sync.Mutex; math/big.table [64]math/big", ""}, + {"go.uber.org/zap/buffer.(*Buffer).AppendString", "go.uber.org/zap/buffer"}, + } + + for _, tt := range tests { + t.Run(tt.symbol, func(t *testing.T) { + packageName := packageName(tt.symbol) + if diff := cmp.Diff(tt.expectedPackageName, packageName); diff != "" { + t.Errorf("Package name mismatch (-want +got):\n%s", diff) + } + }) + } +}