首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  程序员

golang 检测 cgo 内存泄露

  •  
  •   guonaihong · 28 天前 · 840 次点击

    此方法送给经常 cgo 的你,常在河边走(写 c 代码),哪有不湿鞋(内存泄露)。

    构造测试环境

    • cgo.go
    import (
        "fmt"
        "time"
        "unsafe"
    )
    
    func xx() {
        for i := 0; i < 100; i++ {
            p := C.my_malloc(200)
            fmt.Printf("%p\n", unsafe.Pointer(p))
        }   
    }
    
    func main() {
        time.Sleep(time.Second * 3)
    }
    
    

    bug.h

    
    #include "bug.h"
    #include <stdlib.h>
    void* my_malloc(size_t n) {
        return malloc(n);
    }
    
    

    bug.c

    
    #include "bug.h"
    #include <stdlib.h>
    void* my_malloc(size_t n) {
        return malloc(n);
    }
    
    

    运行

    gcc -shared bug.c -o libbug.so -g
    go build cgo.go
    LD_LIBRARY_PATH=. valgrind --leak-check=full --track-origins=yes ./cgo
    

    总结

    眼见的你已经发现熟悉的家伙,valgrind.valgrind 检测 c/c++代码可以,能在用在 go 的 cgo 环境吗? 亲测只能看到部分 c 的调用栈。还是要结合代码做分析。没有检测 c/c++代码来得爽,但比两眼一摸黑好多了。至少告诉你 cgo 的代码有没有内存泄露。

    交流学习

    有没有更好的在 cgo 检测内存泄露的方法???

    github

    https://github.com/guonaihong/gout

    2 回复  |  直到 2019-10-21 14:24:26 +08:00
        1
    NoobPhper   28 天前 via Android
    1.14 新增了 arg 可以对 unsafe ptr 检测
        2
    guonaihong   27 天前
    @NoobPhper go1.14 版本?那还要等大半年。还挺期待的。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4418 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 06:14 · PVG 14:14 · LAX 22:14 · JFK 01:14
    ♥ Do have faith in what you're doing.