nikolaydubina/go-binsize-treemap

GitHub: nikolaydubina/go-binsize-treemap

将 Go 二进制文件的符号大小数据可视化为 SVG 矩形树图,帮助开发者直观分析编译产物体积构成。

Stars: 590 | Forks: 18

# 🔍 Go 二进制文件大小 SVG 矩形树图

✨ 由 NDX AI Shopping Assistant 赞助

[![Go 参考](https://pkg.go.dev/badge/github.com/nikolaydubina/go-binsize-treemap.svg)](https://pkg.go.dev/github.com/nikolaydubina/go-binsize-treemap) [![codecov](https://codecov.io/gh/nikolaydubina/go-binsize-treemap/branch/main/graph/badge.svg?token=jK465mG5iO)](https://codecov.io/gh/nikolaydubina/go-binsize-treemap) [![Go 报告卡](https://goreportcard.com/badge/github.com/nikolaydubina/go-binsize-treemap)](https://goreportcard.com/report/github.com/nikolaydubina/go-binsize-treemap) [![go-recipes](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/531ad0c370202500.svg)](https://github.com/nikolaydubina/go-recipes) [![Hits](https://hits.sh/github.com/nikolaydubina/go-binsize-treemap.svg?view=today-total)](https://hits.sh/github.com/nikolaydubina/go-binsize-treemap/) [![OpenSSF 记分卡](https://api.securityscorecards.dev/projects/github.com/nikolaydubina/go-binsize-treemap/badge)](https://securityscorecards.dev/viewer/?uri=github.com/nikolaydubina/go-binsize-treemap) ``` $ go install github.com/nikolaydubina/go-binsize-treemap@latest $ go tool nm -size | go-binsize-treemap > binsize.svg ``` ## 免责声明 你应该担心可执行二进制文件的大小吗? 在 2022 年,几秒钟的猫咪视频甚至一张图片就有几十 MB。 通过网络传输它们也不是什么大问题。 所以,可能你不需要太担心这个问题。 然而,这个工具在几种情况下仍然很有用。 - 你正在研究编译器。 - 你正在调查二进制文件中包含了哪些第三方依赖。 - 你正在检查嵌入了多少数据。 - 你正在估计包中包含了多少代码。 - 你正在研究包含了哪些符号。 - 你正在使用 `cgo`。 - 你正在进行矩形树图可视化。 我在业余时间构建了这个工具,作为我之前构建的 Go 矩形树图工具的另一个用例。希望你喜欢!欢迎提交 Issue 或 PR! ## 示例 _

github.com/gohugoio/hugo

_ _

62MB,这是一个著名的大型 Go 项目示例

_ ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/4199179910202501.svg) _

github.com/cockroachdb/cockroach

_ _

71MB,这个著名的数据库使用 C++ 构建

_ ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/5bb3412ac4202502.svg) _

github.com/goccy/go-graphviz

_ _

6.5MB,该项目包含 CGO,并使用大量 C 语言的 graphviz 代码构建

_ ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/aab9d4fc76202504.svg) _

github.com/zalando/skipper

_ _

36MB,这是一个大型 Go 项目,某些构建可能会包含 C

_ ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/f193ffdf50202505.svg) ## 知识库 这是接口相关代码。 请参阅 Russ Cox 的这篇[文章](https://research.swtch.com/interfaces)。 正如 Cockroach 团队所调查的,这是用于 trace 的 Go 运行时结构([参考](https://www.cockroachlabs.com/blog/go-file-size/))。 过去在 GitHub [讨论串](https://github.com/golang/go/issues/36313)中关于它为什么这么大以及该怎么做的讨论(嗯,没什么可做的)。 ## 已知问题与待办事项 - [ ] 大小与实际二进制文件大小略有出入。包含未知部分也无济于事。 - [ ] 更好的 C++ 符号名解析 - [ ] 识别 go:embed - [ ] 按类型着色 + 增加亮度 (sys; user; c++; go:embed; 等等) - [ ] 按符号类型着色 - [ ] 热力图依据 ???? ## 相关工作 - https://github.com/knz/go-binsize-viz — 这是本工具的灵感来源。然而,该工具使用的是 Python、D3 和 Javascript,而本工具完全使用纯 Go 技术栈,并且有测试覆盖率。可以说,缺点是它不是交互式的。 - https://github.com/jondot/goweight — 看起来它一开始还能正常工作,但截至 2022-01-22,它对我来说已经不能用了,而且早在 2020-01-23 就有报告指出它不准确。 ## 参考 - https://github.com/knz/go-binsize-viz - https://github.com/jondot/goweight - https://github.com/nikolaydubina/treemap - https://github.com/nikolaydubina/go-cover-treemap - https://github.com/golang/go/blob/master/src/cmd/nm/doc.go - https://linux.die.net/man/1/c++filt - https://github.com/goccy/go-graphviz - https://research.swtch.com/interfaces ## 附录 A:奇怪的输出 / C++ / CGO 你可能需要先对 symtab 文件进行解混淆(demungle)。安装 `c++flit`。然后先处理 symtab。 注意,C++ 支持仍在开发中。 ``` $ go tool nm -size | c++filt | go-binsize-treemap > binsize.svg ``` ## 附录 B:大尺寸与丰富细节 如果你将尺寸设置得非常大,你可以看到很多细节并在地图中导航。 推荐使用 4096x4096 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e070782fb9202506.svg) ... 但你可以设置得更高 ![](https://raw.githubusercontent.com/nikolaydubina/go-binsize-treemap/main/docs/hugo-16384x16384.svg) ## 附录 C:小尺寸与信息预览 你可以生成项目的微缩预览图,例如适合嵌入到 README 中。 推荐使用 1024x256 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/f69e308073202511.svg) ## 文档 ``` $ cat testdata/go-graphviz.symtab | ./go-binsize-treemap -csv > docs/go-graphviz.csv $ cat testdata/go-graphviz.symtab | ./go-binsize-treemap > docs/go-graphviz.svg $ cat testdata/go-graphviz.symtab | ./go-binsize-treemap -w 4096 -h 4096 > docs/go-graphviz-4096x4096.svg $ cat testdata/cockroach.symtab | ./go-binsize-treemap -csv > docs/cockroach.csv $ cat testdata/cockroach.symtab | ./go-binsize-treemap > docs/cockroach.svg $ cat testdata/cockroach.symtab | ./go-binsize-treemap -w 4096 -h 4096 > docs/cockroach-4096x4096.svg $ cat testdata/skipper.symtab | ./go-binsize-treemap > docs/skipper.svg $ cat testdata/hugo.symtab | ./go-binsize-treemap -csv > docs/hugo.csv $ cat testdata/hugo.symtab | ./go-binsize-treemap > docs/hugo.svg $ cat testdata/hugo.symtab | ./go-binsize-treemap -w 1024 -h 128 > docs/hugo-1024x128.svg $ cat testdata/hugo.symtab | ./go-binsize-treemap -w 1024 -h 256 > docs/hugo-1024x256.svg $ cat testdata/hugo.symtab | ./go-binsize-treemap -w 1024 -h 512 > docs/hugo-1024x512.svg $ cat testdata/hugo.symtab | ./go-binsize-treemap -w 4096 -h 4096 > docs/hugo-4096x4096.svg $ cat testdata/hugo.symtab | ./go-binsize-treemap -w 16384 -h 16384 > docs/hugo-16384x16384.svg ```
标签:DNS解析, EVTX分析, Go语言, SVG可视化, Treemap, WebSocket, 二进制文件分析, 代码体积, 代码示例, 依赖分析, 开源项目, 性能优化, 数据分析, 日志审计, 检测绕过, 矩形树图, 程序破解, 编译器研究