aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/pprof
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/pprof')
-rw-r--r--src/runtime/pprof/pprof_test.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go
index e9f287df60..19641f62aa 100644
--- a/src/runtime/pprof/pprof_test.go
+++ b/src/runtime/pprof/pprof_test.go
@@ -15,6 +15,7 @@ import (
"internal/syscall/unix"
"internal/testenv"
"io"
+ "iter"
"math"
"math/big"
"os"
@@ -1784,6 +1785,50 @@ func TestGoroutineProfileConcurrency(t *testing.T) {
}
}
+// Regression test for #69998.
+func TestGoroutineProfileCoro(t *testing.T) {
+ testenv.MustHaveParallelism(t)
+
+ goroutineProf := Lookup("goroutine")
+
+ // Set up a goroutine to just create and run coroutine goroutines all day.
+ iterFunc := func() {
+ p, stop := iter.Pull2(
+ func(yield func(int, int) bool) {
+ for i := 0; i < 10000; i++ {
+ if !yield(i, i) {
+ return
+ }
+ }
+ },
+ )
+ defer stop()
+ for {
+ _, _, ok := p()
+ if !ok {
+ break
+ }
+ }
+ }
+ var wg sync.WaitGroup
+ done := make(chan struct{})
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for {
+ iterFunc()
+ select {
+ case <-done:
+ default:
+ }
+ }
+ }()
+
+ // Take a goroutine profile. If the bug in #69998 is present, this will crash
+ // with high probability. We don't care about the output for this bug.
+ goroutineProf.WriteTo(io.Discard, 1)
+}
+
func BenchmarkGoroutine(b *testing.B) {
withIdle := func(n int, fn func(b *testing.B)) func(b *testing.B) {
return func(b *testing.B) {