<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Goroutine 泄漏防治神器 goleak

    VSole2022-08-01 10:56:34

    推薦 goleak 的背景

    goroutine 作為 golang 并發實現的核心組成部分,非常容易上手使用,但卻很難駕馭得好。我們經常會遭遇各種形式的 goroutine 泄漏,這些泄漏的 goroutine 會一直存活直到進程終結。它們的占用的棧內存一直無法釋放、關聯的堆內存也不能被 GC 清理,系統的可用內存會隨泄漏 goroutine 的增多越來越少,直至崩潰!

    goroutine 的泄漏通常伴隨著復雜的協程間通信,代碼評審和常規的單元測試通常更專注于業務邏輯正確,很難完全覆蓋 goroutine 泄漏的場景;而 pprof 等性能分析工具更多是作用于監控報警/故障之后的復盤。我們需要一款能在編譯部署前識別 goroutine 泄漏的工具,從更上游把控工程質量。

    goleak(https://github.com/uber-go/goleak MIT 許可協議) 是 Uber 團隊開源的一款 goroutine 泄漏檢測工具,它可以非常輕量地集成到測試中,對于 goroutine 泄漏的防治和工程魯棒性的提升很有幫助。

    防范勝于救災

    goroutine 泄漏舉例 

    先舉個 goroutine 泄漏的例子;如下所示,leak 方法中的 ch 永遠沒有讀操作且不會關閉,寫入 ch 的 goroutine 一直處于阻塞狀態,這是一種很典型的 goroutine 泄漏。

    func leak() {
        ch := make(chan struct{})
        go func() {
            ch <- struct{}{}
        }()
    }
    

    通常我們會為 leak方法寫類似下面的測試:

    func TestLeak(t *testing.T) {
        leak()
    }
    

    用 go test 執行測試看看結果:

    $ go test -v -run ^TestLeak$
    === RUN   TestLeak
    --- PASS: TestLeak (0.00s)
    PASS
    ok      cool-go.gocn.vip/goleak 0.007s
    

    測試不出意外地順利通過了,go 內置的測試顯然無法幫我們識別 leak中的 goroutine 泄漏。

    集成 goleak 測試 

    goleak 暴露的方法特別精簡,通常我們只需關注 VerifyNone 和 VerifyTestMain 兩個方法,它們也對應了 goleak 的兩種集成方式:

    逐用例集成

    在現有測試的首行添加 defer goleak.VerifyNone(t),即可集成 goleak 泄漏檢測:

    func TestLeakWithGoleak(t *testing.T) {
        defer goleak.VerifyNone(t)
        leak()
    }
    

    這次的 go test 失敗了:

    $ go test -v -run ^TestLeakWithGoleak$
    === RUN   TestLeakWithGoleak
        leaks.go:78: found unexpected goroutines:
            [Goroutine 19 in state chan send, with cool-go.gocn.vip/goleak.leak.func1 on top of the stack:
            goroutine 19 [chan send]:
            cool-go.gocn.vip/goleak.leak.func1(0xc00008c420)
                    /Users/blanet/gocn/goleak/main.go:24 +0x35
            created by cool-go.gocn.vip/goleak.leak
                    /Users/blanet/gocn/goleak/main.go:23 +0x4e
            ]
    --- FAIL: TestLeakWithGoleak (0.45s)
    FAIL
    exit status 1
    FAIL    cool-go.gocn.vip/goleak 0.459s
    

    測試報告顯示名為 leak.func1 的 goroutine 發生了泄漏(leak.func1 在這里指的是 leak 方法中的第一個匿名方法),并將測試結果置為失敗。我們成功通過 goleak 找到了 goroutine 泄漏。

    通過 TestMain 集成

    如果覺得逐用例集成 goleak 的方式太過繁瑣或 “入侵” 性太強,不妨試試完全不改變原有測試用例,通過在 TestMain中添加 goleak.VerifyTestMain(m) 的方式集成 goleak

    func TestMain(m *testing.M) {
        goleak.VerifyTestMain(m)
    }
    

    這次的 go test 輸出如下:

    $ go test -v -run ^TestLeak$
    === RUN   TestLeak
    --- PASS: TestLeak (0.00s)
    PASS
    goleak: Errors on successful test run: found unexpected goroutines:
    [Goroutine 19 in state chan send, with cool-go.gocn.vip/goleak.leak.func1 on top of the stack:
    goroutine 19 [chan send]:
    cool-go.gocn.vip/goleak.leak.func1(0xc00008c2a0)
            /Users/blanet/gocn/goleak/main.go:24 +0x35
    created by cool-go.gocn.vip/goleak.leak
            /Users/blanet/gocn/goleak/main.go:23 +0x4e
    ]
    exit status 1
    FAIL    cool-go.gocn.vip/goleak 0.455s
    

    可見,goleak 再次成功檢測到了 goroutine 泄漏,但與逐用例集成不同的是,goleak.VerifyTestMain會先報告用例執行的結果,然后再進行泄漏分析。如果單次測試執行了多個用例且最終發生泄漏,那么以 TestMain 方式集成的 goleak 并不能精準定位發生 goroutine 泄漏的用例,還需進一步分析。

    goleak 提供了如下腳本用于進一步推斷具體發生 goroutine 泄漏的用例,其本質是逐一執行所有用例進行分析:
    # Create a test binary which will be used to run each test individually
    $ go test -c -o tests
    # Run each test individually, printing "." for successful tests, or the test name
    # for failing tests.
    $ for test in $(go test -list . | grep -E "^(Test|Example)"); do
        ./tests -test.run "^$test\$" &>/dev/null && echo -n "." || echo "\n$test failed"
    done
    

     總結

    goleak 通過對運行時的棧分析獲取 goroutine 狀態,并設計了非常簡潔易用的接口與測試框架進行對接,是一款小巧強悍的 goroutine 泄漏防治利器。

    當然,完備的測試用例支持是 goleak 發揮作用的基礎,大家還是要老老實實寫測試,穩穩當當搞生產!

    test
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    AV-TEST 和 AV-Comparatives 是兩家知名的反惡意軟件評估公司。盡管久負盛名,但是前者遇到了一件尷尬的事情:官方 Twitter 賬號于 7 月 25 日被黑了,但時間過去 1 周仍未恢復對其的控制。
    前不久,國際權威測評機構AV-TEST發布了最新的企業安全產品測評結果,在測評的19個企業級終端安全產品中,深信服EDR在檢測能力、性能消耗以及可用性三個評估維度拿到了全部滿分(6分為滿分)的好成績,也是國內首個全部滿分的終端安全產品,意味著深信服EDR在終端安全防護能力上獲得了的專業肯定與認可。
    AV-TEST統計數據顯示,2022年在Windows平臺上發現了近 7000 萬個新的惡意軟件樣本;macOS 上只有大約 1.2 萬個惡意軟件。
    編寫測試代碼和編寫普通的Go代碼過程是類似的,并不需要學習新的語法、規則或工具。go test命令是一個按照一定約定和組織的測試代碼的驅動程序。
    主要測試思路xss:test+()@example.com. Header注入"%0d%0aContent-Length:%200%0d%0a%0d%0a"@example.com. "recipient@test.com>\r\nRCPT TO:test.com
    它通過解壓縮 APK 并應用一系列規則來檢測這些漏洞來做到這一點https://github.com/SUPERAndroidAnalyzer/super9、AndroBugs 框架是一種高效的 Android 漏洞掃描程序,可幫助開發人員或黑客發現 Android 應用程序中的潛在安全漏洞。它可以修改任何主進程的代碼,不管是用Java還是C/C++編寫的。
    在整個軟件開發生命周期中,可以在開發與測試階段中使用IAST工具。之后啟動tomcat,查看agent是否正常上線。再看一下請求信息,通過請求信息找一下代碼入口,入口是在DocController.java的deleteDoc方法中。529行調用deleteDoc,跟入deleteDoc函數。deleteRealDoc中直接對原始請求參數進行拼接,完成文件刪除,觸發漏洞。通過數據流圖也可以初步判斷漏洞是否存在,假如通過修改傳入的污點值可以在最后危險函數處進行漏洞觸發,即可認為是存在漏洞的。
    位于德國的IT安全研究機構AV-TEST發布了針對Windows 10家庭用戶的2021年10月最佳殺毒程序評估報告。
    |常見掃描器特征
    2021-10-28 07:42:24
    by_wvs. acunetix. acunetix_wvs. acunetix_test. headersAcunetix-Aspect-Password:. Cookie: acunetixCookie. Cookie: acunetix.
    常見掃描器特征
    2021-10-25 04:13:52
    url acunetix-wvs-test-for-some-inexistent-file by_wvs acunetix_wvs_security_test acunetix acunetix_wvs acunetix_test
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类