Source file
src/runtime/debug/heapdump_test.go
1
2
3
4
5 package debug_test
6
7 import (
8 "os"
9 "runtime"
10 . "runtime/debug"
11 "testing"
12 )
13
14 func TestWriteHeapDumpNonempty(t *testing.T) {
15 if runtime.GOOS == "js" {
16 t.Skipf("WriteHeapDump is not available on %s.", runtime.GOOS)
17 }
18 f, err := os.CreateTemp("", "heapdumptest")
19 if err != nil {
20 t.Fatalf("TempFile failed: %v", err)
21 }
22 defer os.Remove(f.Name())
23 defer f.Close()
24 WriteHeapDump(f.Fd())
25 fi, err := f.Stat()
26 if err != nil {
27 t.Fatalf("Stat failed: %v", err)
28 }
29 const minSize = 1
30 if size := fi.Size(); size < minSize {
31 t.Fatalf("Heap dump size %d bytes, expected at least %d bytes", size, minSize)
32 }
33 }
34
35 type Obj struct {
36 x, y int
37 }
38
39 func objfin(x *Obj) {
40
41 }
42
43 func TestWriteHeapDumpFinalizers(t *testing.T) {
44 if runtime.GOOS == "js" {
45 t.Skipf("WriteHeapDump is not available on %s.", runtime.GOOS)
46 }
47 f, err := os.CreateTemp("", "heapdumptest")
48 if err != nil {
49 t.Fatalf("TempFile failed: %v", err)
50 }
51 defer os.Remove(f.Name())
52 defer f.Close()
53
54
55 println("allocating objects")
56 x := &Obj{}
57 runtime.SetFinalizer(x, objfin)
58 y := &Obj{}
59 runtime.SetFinalizer(y, objfin)
60
61
62 println("starting gc")
63 runtime.GC()
64
65
66 println("starting dump")
67 WriteHeapDump(f.Fd())
68 println("done dump")
69 }
70
71 type G[T any] struct{}
72 type I interface {
73 M()
74 }
75
76
77 func (g G[T]) M() {}
78
79 var dummy I = G[int]{}
80 var dummy2 I = G[G[int]]{}
81
82 func TestWriteHeapDumpTypeName(t *testing.T) {
83 if runtime.GOOS == "js" {
84 t.Skipf("WriteHeapDump is not available on %s.", runtime.GOOS)
85 }
86 f, err := os.CreateTemp("", "heapdumptest")
87 if err != nil {
88 t.Fatalf("TempFile failed: %v", err)
89 }
90 defer os.Remove(f.Name())
91 defer f.Close()
92 WriteHeapDump(f.Fd())
93 dummy.M()
94 dummy2.M()
95 }
96
View as plain text