ondrajz / go-callvis

Visualize call graph of a Go program using Graphviz
https://ofabry.github.io/go-callvis
MIT License
5.85k stars 406 forks source link

callvis crashed with "out of memory" while running on Ubuntu 18.04 #43

Closed fredzhou closed 4 years ago

fredzhou commented 5 years ago

go version go1.11.4 linux/amd64

part of the printout:

fredzhou@fredzhou-Ubuntu:~/go/src/github.com/ethereum/go-ethereum$ go-callvis "github.com/syncthing/syncthing/cmd/stcli"
fatal error: runtime: out of memory

runtime stack:
runtime.throw(0x91d522, 0x16)
    /usr/local/go/src/runtime/panic.go:608 +0x72
runtime.sysMap(0xc014000000, 0x4000000, 0xcf2298)
    /usr/local/go/src/runtime/mem_linux.go:156 +0xc7
runtime.(*mheap).sysAlloc(0xcd8ea0, 0x4000000, 0x7f756002b260, 0x7f7561379d00)
    /usr/local/go/src/runtime/malloc.go:619 +0x1c7
runtime.(*mheap).grow(0xcd8ea0, 0xf7, 0x0)
    /usr/local/go/src/runtime/mheap.go:920 +0x42
runtime.(*mheap).allocSpanLocked(0xcd8ea0, 0xf7, 0xcf22a8, 0x20300100000000)
    /usr/local/go/src/runtime/mheap.go:848 +0x337
runtime.(*mheap).alloc_m(0xcd8ea0, 0xf7, 0x410100, 0x7f7560325400)
    /usr/local/go/src/runtime/mheap.go:692 +0x119
runtime.(*mheap).alloc.func1()
    /usr/local/go/src/runtime/mheap.go:759 +0x4c
runtime.(*mheap).alloc(0xcd8ea0, 0xf7, 0x7f7561010100, 0x417675)
    /usr/local/go/src/runtime/mheap.go:758 +0x8a
runtime.largeAlloc(0x1ede80, 0x450001, 0x7f75676d16c0)
    /usr/local/go/src/runtime/malloc.go:1019 +0x97
runtime.mallocgc.func1()
    /usr/local/go/src/runtime/malloc.go:914 +0x46
runtime.systemstack(0x0)
    /usr/local/go/src/runtime/asm_amd64.s:351 +0x66
runtime.mstart()
    /usr/local/go/src/runtime/proc.go:1229

goroutine 295 [running]:
runtime.systemstack_switch()
    /usr/local/go/src/runtime/asm_amd64.s:311 fp=0xc00b2b49f8 sp=0xc00b2b49f0 pc=0x4567f0
runtime.mallocgc(0x1ede80, 0x8c56e0, 0x1, 0x0)
    /usr/local/go/src/runtime/malloc.go:913 +0x896 fp=0xc00b2b4a98 sp=0xc00b2b49f8 pc=0x40d7e6
runtime.newarray(0x8c56e0, 0x1108, 0x0)
    /usr/local/go/src/runtime/malloc.go:1048 +0x6a fp=0xc00b2b4ac8 sp=0xc00b2b4a98 pc=0x40dbba
runtime.makeBucketArray(0x87ea80, 0x32f574628b75c50c, 0x0, 0x0, 0x0)
    /usr/local/go/src/runtime/map.go:355 +0x184 fp=0xc00b2b4b00 sp=0xc00b2b4ac8 pc=0x40ea84
runtime.hashGrow(0x87ea80, 0xc002d7e060)
    /usr/local/go/src/runtime/map.go:963 +0x89 fp=0xc00b2b4b50 sp=0xc00b2b4b00 pc=0x4102d9
runtime.mapassign(0x87ea80, 0xc002d7e060, 0xc00b2b4bf8, 0x0)
    /usr/local/go/src/runtime/map.go:623 +0x2af fp=0xc00b2b4bd8 sp=0xc00b2b4b50 pc=0x40f44f
go/types.(*Checker).recordTypeAndValue(0xc00016d2c0, 0x99f440, 0xc003189920, 0xc003189907, 0x99d160, 0xc00b5e5bb0, 0x0, 0x0)
    /usr/local/go/src/go/types/check.go:292 +0x13c fp=0xc00b2b4c40 sp=0xc00b2b4bd8 pc=0x5b6cfc
go/types.(*Checker).rawExpr(0xc00016d2c0, 0xc005af26c0, 0x99f440, 0xc003189920, 0x0, 0x0, 0x0)
    /usr/local/go/src/go/types/expr.go:993 +0x299 fp=0xc00b2b4ce0 sp=0xc00b2b4c40 pc=0x5c2a09
go/types.(*Checker).multiExpr(0xc00016d2c0, 0xc005af26c0, 0x99f440, 0xc003189920)
    /usr/local/go/src/go/types/expr.go:1575 +0x58 fp=0xc00b2b4d48 sp=0xc00b2b4ce0 pc=0x5c6c38
go/types.(*Checker).call.func1(0xc005af26c0, 0x0)
    /usr/local/go/src/go/types/call.go:65 +0x61 fp=0xc00b2b4d78 sp=0xc00b2b4d48 pc=0x5ed701
go/types.unpack(0xc00b2b4e70, 0x1, 0xc007f88000, 0xc0032adf40, 0xc00c702330, 0x1)
    /usr/local/go/src/go/types/call.go:181 +0x61 fp=0xc00b2b4de0 sp=0xc00b2b4d78 pc=0x5b4031
go/types.(*Checker).call(0xc00016d2c0, 0xc005af2680, 0xc0032b4480, 0x2)
    /usr/local/go/src/go/types/call.go:65 +0x36a fp=0xc00b2b4e98 sp=0xc00b2b4de0 pc=0x5b38ba
go/types.(*Checker).exprInternal(0xc00016d2c0, 0xc005af2680, 0x99ec80, 0xc0032b4480, 0x0, 0x0, 0x7f75676d16c0)
    /usr/local/go/src/go/types/expr.go:1445 +0x1d0c fp=0xc00b2b5448 sp=0xc00b2b4e98 pc=0x5c47bc
go/types.(*Checker).rawExpr(0xc00016d2c0, 0xc005af2680, 0x99ec80, 0xc0032b4480, 0x0, 0x0, 0x2)
    /usr/local/go/src/go/types/expr.go:969 +0x81 fp=0xc00b2b54e8 sp=0xc00b2b5448 pc=0x5c27f1
go/types.(*Checker).stmt(0xc00016d2c0, 0x0, 0x99eec0, 0xc0032a8a20)
    /usr/local/go/src/go/types/stmt.go:325 +0x40c5 fp=0xc00b2b5c48 sp=0xc00b2b54e8 pc=0x5e2ef5
go/types.(*Checker).stmtList(0xc00016d2c0, 0x0, 0xc003289800, 0xf, 0x10)
    /usr/local/go/src/go/types/stmt.go:120 +0xd6 fp=0xc00b2b5ca0 sp=0xc00b2b5c48 pc=0x5dd876
go/types.(*Checker).funcBody(0xc00016d2c0, 0xc0084d82a0, 0xc00328cde0, 0x3, 0xc0087460f0, 0xc0032b04b0, 0x0, 0x0)
    /usr/local/go/src/go/types/stmt.go:42 +0x1ea fp=0xc00b2b5d90 sp=0xc00b2b5ca0 pc=0x5dd1fa
go/types.(*Checker).funcDecl.func1()
    /usr/local/go/src/go/types/decl.go:611 +0x67 fp=0xc00b2b5de0 sp=0xc00b2b5d90 pc=0x5edb57
go/types.(*Checker).processDelayed(0xc00016d2c0, 0x0)
    /usr/local/go/src/go/types/resolver.go:583 +0x33 fp=0xc00b2b5df0 sp=0xc00b2b5de0 pc=0x5d9143
go/types.(*Checker).checkFiles(0xc00016d2c0, 0xc002d7c120, 0xc, 0xc, 0x0, 0x0)
    /usr/local/go/src/go/types/check.go:252 +0xbc fp=0xc00b2b5e20 sp=0xc00b2b5df0 pc=0x5b6a1c
go/types.(*Checker).Files(0xc00016d2c0, 0xc002d7c120, 0xc, 0xc, 0x1c, 0xc000b73d10)
    /usr/local/go/src/go/types/check.go:241 +0x49 fp=0xc00b2b5e60 sp=0xc00b2b5e20 pc=0x5b6939
github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader.(*importer).addFiles(0xc000099680, 0xc00048b130, 0xc002d7c120, 0xc, 0xc, 0x1)
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader/loader.go:1022 +0x191 fp=0xc00b2b5f00 sp=0xc00b2b5e60 pc=0x603691
github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader.(*importer).load(0xc000099680, 0xc001467180, 0x0)
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader/loader.go:981 +0x163 fp=0xc00b2b5fa0 sp=0xc00b2b5f00 pc=0x603433
github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader.(*importer).startLoad.func1(0xc000099680, 0xc001467180, 0xc002d7a4c0)
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader/loader.go:962 +0x39 fp=0xc00b2b5fc8 sp=0xc00b2b5fa0 pc=0x604e59
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc00b2b5fd0 sp=0xc00b2b5fc8 pc=0x4588d1
created by github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader.(*importer).startLoad
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader/loader.go:961 +0x191

goroutine 1 [chan receive]:
github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader.(*importInfo).awaitCompletion(...)
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader/loader.go:447
github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader.(*importer).importAll(0xc000099680, 0x0, 0x0, 0xc00002a004, 0x35, 0xc000113ec0, 0x0, 0x0, 0x0, 0x0, ...)
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader/loader.go:913 +0x406
github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader.(*Config).Load(0xc0000e0420, 0xc00009c010, 0x1, 0x1)
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/vendor/golang.org/x/tools/go/loader/loader.go:521 +0x27f
main.doAnalysis(0xcd3060, 0x0, 0xc00009c010, 0x1, 0x1)
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/analysis.go:34 +0x17e
main.main()
    /home/fredzhou/go/src/github.com/TrueFurby/go-callvis/main.go:80 +0x108
ondrajz commented 4 years ago

You just need more memory, some code produces very large callgraphs that requires a lot of memory to process.

tigerinus commented 1 year ago

can it swap some data to disk on the go?