]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/pprof: add a test for gccgo bug #29448
authorCherry Zhang <cherryyz@google.com>
Mon, 31 Dec 2018 04:53:27 +0000 (23:53 -0500)
committerCherry Zhang <cherryyz@google.com>
Mon, 7 Jan 2019 20:36:58 +0000 (20:36 +0000)
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 <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/pprof/pprof_test.go

index e395d153102c2e75595acdc4385913485ae6c18e..7c6043ffdb2e830cbe39b38586d1f3a123c01ac1 100644 (file)
@@ -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)
+       }
+}