From: Cherry Zhang Date: Mon, 31 Dec 2018 04:53:27 +0000 (-0500) Subject: runtime/pprof: add a test for gccgo bug #29448 X-Git-Tag: go1.12beta2~23 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=902b1f605908cc412e418ede6821fd8122979297;p=gostls13.git runtime/pprof: add a test for gccgo bug #29448 With gccgo, if a profiling signal arrives in certain time during traceback, it may crash or hang. The fix is CL 156037 and CL 156038. This CL adds a test. Updates #29448. Change-Id: Idb36af176b4865b8fb31a85cad185ed4c07ade0c Reviewed-on: https://go-review.googlesource.com/c/156018 Reviewed-by: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go index e395d15310..7c6043ffdb 100644 --- a/src/runtime/pprof/pprof_test.go +++ b/src/runtime/pprof/pprof_test.go @@ -1010,3 +1010,38 @@ func TestAtomicLoadStore64(t *testing.T) { atomic.StoreUint64(&flag, 1) <-done } + +func TestTracebackAll(t *testing.T) { + // With gccgo, if a profiling signal arrives at the wrong time + // during traceback, it may crash or hang. See issue #29448. + f, err := ioutil.TempFile("", "proftraceback") + if err != nil { + t.Fatalf("TempFile: %v", err) + } + defer os.Remove(f.Name()) + defer f.Close() + + if err := StartCPUProfile(f); err != nil { + t.Fatal(err) + } + defer StopCPUProfile() + + ch := make(chan int) + defer close(ch) + + count := 10 + for i := 0; i < count; i++ { + go func() { + <-ch // block + }() + } + + N := 10000 + if testing.Short() { + N = 500 + } + buf := make([]byte, 10*1024) + for i := 0; i < N; i++ { + runtime.Stack(buf, true) + } +}