uber-go/goleak

GitHub: uber-go/goleak

一款用于在 Go 测试结束时检测并防止 Goroutine 泄漏的轻量级工具库。

Stars: 5208 | Forks: 162

# goleak [![GoDoc](https://pkg.go.dev/badge/go.uber.org/goleak.svg)][doc] [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/99aadc656c194412.svg)][ci] [![Coverage Status](https://codecov.io/gh/uber-go/goleak/branch/master/graph/badge.svg)][cov] Goroutine 泄漏检测器,用于帮助避免 Goroutine 泄漏。 ## 安装 你可以使用 `go get` 来获取最新版本: `go get -u go.uber.org/goleak` `goleak` 同样支持 semver 版本发布。 请注意,go-leak 仅[支持][release] Go 的两个最新次要版本。 ## 快速开始 为了验证在测试结束时没有意外的 goroutine 正在运行: ``` func TestA(t *testing.T) { defer goleak.VerifyNone(t) // test logic here. } ``` 除了在每个测试结束时检查泄漏,`goleak` 还可以通过为你的 包创建一个 `TestMain` 函数,在 每个测试包结束时运行: ``` func TestMain(m *testing.M) { goleak.VerifyTestMain(m) } ``` ### 注意 对于使用 [t.Parallel](https://pkg.go.dev/testing#T.Parallel) 的测试,`goleak` 无法 区分是发生泄漏的 goroutine 还是尚未运行完毕的测试。 ``` func TestA(t *testing.T) { tt := struct{ name string input SomeType expected string }{ // ... } for _, t := range tt { t.Run(t.name, func(t *testing.T) { t.Parallel() // <- goleak gets confused here! // ... } } } ``` 对于这类情况,你也应该如上所述使用 `goleak.VerifyTestMain`。 ## 确定包泄漏的来源 当使用 `TestMain` 验证泄漏时,泄漏测试只会在所有测试 运行完毕后执行一次。这通常足以确保没有 goroutine 从 测试中泄漏,但是当发生泄漏时,很难确定是哪个测试导致了泄漏。 你可以使用以下 bash 脚本来确定失败测试的来源: ``` # 创建一个 test binary,用于单独运行每个测试 $ go test -c -o tests # 单独运行每个测试,为成功的测试打印“.”,或为 # 失败的测试打印测试名称。 $ for test in $(go test -list . | grep -E "^(Test|Example)"); do ./tests -test.run "^$test\$" &>/dev/null && echo -n "." || echo -e "\n$test failed"; done ``` 这只会打印出失败测试的名称,以便单独进行调查。例如, ``` ..... TestLeakyTest failed ....... ``` ## 稳定性 goleak 是 v1 版本,并严格遵循 [SemVer](http://semver.org/)。 在 2.0 版本之前,不会对导出的 API 进行任何破坏性更改。
标签:EVTX分析, Golang, Goroutine, Go语言, SOC Prime, Uber开源, 代码分析, 内存泄漏, 凭证管理, 协程泄漏, 单元测试, 安全编程, 并发编程, 开发工具, 性能优化, 日志审计, 检测绕过, 测试工具, 程序破解