• C++内存泄漏排查以及几个工具


    近期排查老项目App的偶发闪退问题过程中,发现程序竟然有内存泄漏的情况,表现为连续运行多天后程序占用的虚拟内存和物理内存都会持续升高,经过排查修改,找出了多处内存泄漏,现对排查过程做个小结。

    内存泄漏的确定

    发现内存泄漏一般是在资源监视器中看到提交和工作集的内存占用在程序运行周期内持续升高。

    内存泄漏的表现,下图以有道词典为例说明。“提交”即为该进程使用而保留的虚拟内存的空间,“工作集”即为该进程当前正在使用的物理内存的空间,“可共享”该进程当前正在使用的可与其他进程共享的物理内存量,“专用”即为该进程当前正在使用的不与其他进程共享的物理内存量。

    简单来说,提交内存即为虚拟内存,工作集内存即为物理内存占用。

    发现有内存泄漏的现象,一定要先确认确实是内存泄漏。有的程序在开始运行的时候会持续申请内存,表现出虚拟内存持续升高,但是到一定时间(比如半小时之后)就不会继续升高而变得稳定,在程序关闭的时候会全部释放,这种不属于内存泄漏。

    排查内存泄漏的位置

    最简单的办法就是人工查找。如果对程序的结构和业务逻辑比较清晰,可以通过注释部分业务模块,观察注释前和注释后运行过程中内存的变化,如果发现注释之后,内存增长现象没有了,说明泄漏就在注释的部分,此时如果注释的部分比较少,就比较容易定位到泄漏的位置。通常这个办法比较耗时,而且注释的部分比较多,这时候层层注释观察内存增长就比较慢,建议通过工具查找。

    我使用的编译器为visual studio,我在排查过程中,尝试了多个工具,有个大坑需要说一下。BoundsChecker,目前集成到了DevPartner Studio软件中,这个软件安装到win10企业版,就会作为vs的插件使用,类似番茄助手。但是这个软件耗费了不少时间总是安装失败,有的版本安装不成功,有的版本在vs界面开始点击启动错误检查就会导致vs闪退,还有的版本每次运行就会导致系统蓝屏(CSDN好多网友都会蓝屏),最终我没有一个版本使用成功,建议大家不要入这个坑。

    能够成功使用的工具有windbg的UMDH,LeakDiag,以及VLD(Visual Leak Detector),还有查到PageHeap这个软件还没有测试。

    内存泄漏排查工具

    最先使用的是UMDH,每次执行完毕提示一大堆泄漏,感觉每个地方都有泄漏,一地鸡毛不好查找。原理就是通过多次保存堆栈快照查找增长位置。使用方法参考UMDH帮助排查内存持续增长问题

     

    然后使用LeakDiag,这个小工具使用简单,可以定位到泄漏的动态链接库和具体的函数。但是并不能排查到所有类型的泄漏,比如QT程序,只会定位到qtcore.dll类似的库,而我们只能靠推测,通过观察去发现具体问题出现在涉及QT技术部分的哪里。使用方法可以参考LeakDiag检测内存泄漏 の文件分析

    其中,VLD感觉最好用,具体使用方法可以在网上查找,参考
    Visual C++ 内存泄露检测工具(VLD)。这个工具作为vs的插件使用,程序执行完成后可以从输出窗口看到内存泄漏的具体函数,比较方便。

     

    定位到泄漏的位置,具体处理就不再多说了,能看到处理完后内存增长改善了,那看着真是舒服。

     

     

  • 相关阅读:
    MySQL数据库技术笔记(1)
    Flume学习笔记(4)—— Flume数据流监控
    [附源码]计算机毕业设计ssm新能源电动汽车充电桩服务APP
    无头单向非循环链表(详解)
    Java真实面试(苏州安硕信息)
    浅析电力监控在新型数据中心的设计和应用-Susie 周
    铝型材公司【Brilliance Group】申请1080万美元纳斯达克IPO上市
    常用注解梳理
    【ELM预测】基于极限学习机进行正弦波预测附matlab代码
    关系数据库与文档数据库对比
  • 原文地址:https://blog.csdn.net/weixin_42364825/article/details/126571519