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

田春出的这道内存泄露题你们会怎么做?

  •  
  •   jason52 · 2014-11-05 11:02:23 +08:00 · 4708 次点击
    这是一个创建于 3663 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    22 条回复    2014-11-05 17:16:29 +08:00
    ChangeTheWorld
        1
    ChangeTheWorld  
       2014-11-05 11:20:48 +08:00
    被迫重启……先加一个24天自动重启的脚本再说
    hjc4869
        2
    hjc4869  
       2014-11-05 11:22:14 +08:00
    这种级别的大项目不做好unit test,不在每个unit test上考虑可能产生内存泄漏的地方,就是作死。
    zlbruce
        3
    zlbruce  
       2014-11-05 11:43:01 +08:00
    可以用 valgrind 试试
    shawngao
        4
    shawngao  
       2014-11-05 11:52:47 +08:00
    讲下以前公司的做法:

    一般是先回退版本,测试找到无内存泄漏的commit,以这个commit新建一个checkbranch,让每个开发人员去diff自己模块的最新版本与这个checkbranch,检查自己修改的代码。

    开发人员如果觉得没问题,则将diff提交到checkbranch,由PM编译版本并测试。
    通过后进行下一个。
    openroc
        5
    openroc  
       2014-11-05 11:55:56 +08:00
    之前在windows上遇到过,泄露handle的,一次就是4个字节,由于server连续运行,时间长了,就。。。。。 哈哈
    min
        6
    min  
       2014-11-05 11:55:59 +08:00   ❤️ 1
    一天只漏这么一点点,随便插一条内存可以多跑一个月了
    不够再加
    yanwen
        7
    yanwen  
       2014-11-05 12:25:11 +08:00
    田春 是伞哥么?
    yanwen
        8
    yanwen  
       2014-11-05 12:25:37 +08:00
    擦。。一看 还真是伞哥。。。
    wdlth
        9
    wdlth  
       2014-11-05 13:12:19 +08:00
    写了这么多代码都不做内存泄露检测的么?
    vivyli
        10
    vivyli  
       2014-11-05 13:19:44 +08:00
    @shawngao 感觉这样周期很长,因为说是无法重现,每次rollback都要用客户的环境做测试,一来一回客户就疯掉了。。
    LazyZhu
        11
    LazyZhu  
       2014-11-05 13:23:26 +08:00
    内存dump后看看?
    zhangdawei
        12
    zhangdawei  
       2014-11-05 13:44:22 +08:00
    @vivyli 我们公司也是这么干的,代码历史悠久,别的办法不多。
    codepiano
        13
    codepiano  
       2014-11-05 14:07:46 +08:00
    @wdlth @shawngao 印象中他说过是100W行lisp转成300W行c代码再编译,而且是个很久的项目,这个级别很难吧
    akira
        14
    akira  
       2014-11-05 15:07:06 +08:00   ❤️ 1
    对内存申请/释放函数做钩子 日志记录下调用入口以及申请的大小以及返回内存地址
    跑上一段时间后日志处理下应该就能知道大概是那些调用点出了问题
    stormslowly
        15
    stormslowly  
       2014-11-05 17:03:04 +08:00
    14正解 很多单元测试框架就搞的。。
    cvrock
        16
    cvrock  
       2014-11-05 17:06:21 +08:00
    啥平台?在win下只要开了全页堆windbg扫两眼就能秒杀了。
    nsa
        17
    nsa  
       2014-11-05 17:07:02 +08:00 via iPad
    日志,日志,还是日志
    tabris17
        18
    tabris17  
       2014-11-05 17:09:02 +08:00
    @shawngao 无法重现这个问题
    yuezhimsolo
        19
    yuezhimsolo  
       2014-11-05 17:09:27 +08:00
    总结:应急 - 先加一个24天自动重启的脚本;思路 - 日志;过程 - 回退版本,测试找到无内存泄漏的commit,以这个commit新建一个checkbranch,让每个开发人员去diff自己模块的最新版本与这个checkbranch,检查自己修改的代码。
    关键话:不在每个unit test上考虑可能产生内存泄漏的地方,就是作死。
    tabris17
        20
    tabris17  
       2014-11-05 17:10:29 +08:00
    @akira 这个才是正解
    tabris17
        21
    tabris17  
       2014-11-05 17:12:44 +08:00
    这道题目的关键在于“无法重现这个问题”。否则很好解决,无论是倒退版本做code review还是调试或dump内存。
    tabris17
        22
    tabris17  
       2014-11-05 17:16:29 +08:00
    另外不是有静态代码检查工具的嘛,不是CPPer,具体不清楚
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5305 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:46 · PVG 15:46 · LAX 23:46 · JFK 02:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.