C++ 内存泄漏调试
C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式.
当内存报错弹出一个陌生的地址,我一脸懵逼,不清楚是哪个地方出的错,特别是程序退出的时候报错更不好定位.可以使用第三方工具来定位解决,也可以自己想办法解决.
我在做神经网络训练的时候碰到一个的BUG,发送完训练图片之后直接提示使用了非法内存.
HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed.
代码迭代了多次,部分功能没有测试,也不清楚哪里出的问题.
联想到内存的申请释放方式,申请和释放总是配对的,申请的大小也是预先知道的.在内存申请申请释放的时候加上内存地址打印,当内存泄漏报错的时候就可以定位出错内存地址在哪个范围.我加入了一个内存打印函数,把内存地址范围和时间都打印出来.
void DebugHeap(CString name, void * ptr,int size)
{long Time = GetCurrentTime();TRACE("========>heap name:%s,address [%p:%p],time:%d (ms)\n", name,ptr,(char *)ptr + size,Time);
}
在程序中申请\释放部分加入DebugHeap
static Neural * mThis;
static FileInfo mFileInfo;
Neural *Neural:: GetInstance(MainDlg * parent,DlgCommand * cmd)
{if (mThis == NULL){mThis = new Neural(parent);mCmd = cmd;}return mThis;
}void Neural:: ReleaseInstance()
{if (mThis != NULL)delete mThis;
}Neural::Neural(MainDlg * parent)
{mFileInfo.mRcv = (unsigned char *)malloc(1024);DebugHeap("flag1:alloc", mFileInfo.mRcv, 1024);
}Neural::~Neural(void)
{bWork = FALSE;DebugHeap("flag1:free ", mFileInfo.mRcv, 1024);free(mFileInfo.mRcv);
}
程序运行中的日志
==> ThreadRecvProc Start
==> ThreadInterrupt Start
MainDlg::OnInitDialog()
========>heap name:flag1:alloc,address [0000015E95077CD0:0000015E950780D0],time:7870921 (ms)
“Test.exe”(Win32): 已加载“C:\Windows\System32\clbcatq.dll”。无法查找或打开 PDB 文件。
“Test.exe”(Win32): 已加载“C:\Windows\System32\edputil.dll”。无法查找或打开 PDB 文件。
....
线程 0x2a10 已退出,返回值为 0 (0x0)。
线程 0x2ae4 已退出,返回值为 0 (0x0)。
“Test.exe”(Win32): 已加载“C:\Windows\System32\mswsock.dll”。无法查找或打开 PDB 文件。
连接服务器成功!
线程 0x16c8 已退出,返回值为 96 (0x60)。
线程 0xa0c 已退出,返回值为 0 (0x0)。
“Test.exe”(Win32): 已加载“C:\Windows\System32\msctfuimanager.dll”。无法查找或打开 PDB 文件。
....
========>heap name:flag1:alloc,address [0000015E951577D0:0000015E95157BD0],time:7885500 (ms)
Ending:43707
========>heap name:flag1:free ,address [0000015E951577D0:0000015E95157BD0],time:7885609 (ms)
线程 0x2f20 已退出,返回值为 0 (0x0)。
========>heap name:flag1:alloc,address [0000015E950E4AA0:0000015E950E4EA0],time:7887265 (ms)
analyse:3, D:\数据\FSSD\V5\target.csv
========>heap name:flag1:free ,address [0000015E950E4AA0:0000015E950E4EA0],time:7887296 (ms)
线程 0x2a00 已退出,返回值为 0 (0x0)。
线程 0xe84 已退出,返回值为 0 (0x0)。
HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed
Test.exe 已触发了一个断点。
第一次申请 [0000015E95077CD0:0000015E950780D0] 释放失败
第二次申请[0000015E951577D0:0000015E95157BD0] 释放成功
第三次申请[0000015E950E4AA0:0000015E950E4EA0] 释放成功
从报错的意思看是重复释放内存.0000015E950E4AA0 地址被重复释放,这个地址刚好是第三次申请的地址.
看现象是第一次申请的地址被改动了,查看这部分代码分析原因.
按照我预想在构造函数申请内存,析构函数释放内存,是能配对.代码里加入单例模式并且使用了一个全局变量mFileInfo,随着构造函数调用会不断改变.我预想是这个类只能单例使用,由于历史原因,部分代码并没有使用单例模式.单例中的申请的地址位置被改动了,所以没办法正确释放.统一使用单例模式,这个问题解决了.
C++出现内存错误时候,把申请/释放的地址打印出来能更快更准确的定位到问题.
C++ 内存泄漏调试相关推荐
- Android之内存泄漏调试学习与总结
大家有或经常碰到OOM的问题,对吧?很多这样的问题只要一出现相信大家的想法跟小马的一样,就是自己的应用:优化.优化.再优化!而且如果出现类似于OOM这样级别的问题,根本就不好处理,LogCat日志中显 ...
- delphi XE 下打开内存泄漏调试功能
ReportMemoryLeaksOnShutdown := True; 能提供基本的内存泄漏信息,不是很详细. 转载于:https://www.cnblogs.com/gleam/archive/2 ...
- Android之内存泄漏调试学习与总结,完整PDF
前言 今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟binder驱动交互,实现以最快的方式唤醒新的保活服务,最大程度防止保活失败.同时,我也将跟您分享,我是怎么做到在不 ...
- Android之内存泄漏调试学习与总结,分享PDF高清版
前言 今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟binder驱动交互,实现以最快的方式唤醒新的保活服务,最大程度防止保活失败.同时,我也将跟您分享,我是怎么做到在不 ...
- 一次Java内存泄漏调试的有趣经历
本文由 ImportNew - yizhe 翻译自 allegro.tech.欢迎加入翻译小组.转载请见文末要求. 人人都会犯错,但一些错误是如此的荒谬,我想不通怎么会有人犯这种错误.更没想到的是,这 ...
- 重磅消息!Java之内存泄漏调试学习与总结,分享PDF高清版
前言 现在刷抖音经常可以看到一些老外街坊,问他们最想把什么带回自己的国家,我听过很多的回答都是:淘宝,支付宝,美食,微信,外卖,高铁等等. 确实如此,随着国家的快速发展吸引了不少国际上羡慕的目光,更让 ...
- centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)
写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...
- 在vc2008中用_crtBreakAlloc调试内存泄漏
在vc2008中用_crtBreakAlloc调试内存泄漏 2012-07-27 16:58:25 分类: C/C++ 这两天调一个程序,发现每次退出都有内存泄漏,在此总结一个调试内存泄漏的好方法. ...
- Visual Studio中检测内存泄漏的方法(一)
有些内存泄露是不会dump出来详细信息的,只会给出内存块号,这种情况一下一般可以用一下方法调试出来. 这两天调一个程序,发现每次退出都有内存泄漏,在此总结一个调试内存泄漏的好方法. 对于比较明显的内存 ...
最新文章
- 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
- ssm上传文件获取路径_SSM文件上传
- Ruby中求50之内的素数方法
- JavaScript this 关键词
- 大话西游维护完怎么刷服务器,大话西游2很实用:看高玩教你如何快速刷齐高端套装...
- C++11常见新特性
- 在Session中放HashMap在Jsp中用JSTL遍历方法
- Spring(三) 表单页面处理
- 3d胆码计算机方法,3D选胆码方法公式汇总(近88期数据)
- 【MySQL5.7指南】第一章——概述
- Android 录制手机内部声音(screen recorder)framework层问题分析
- C++构造函数与类型转换explicit(大疆2018校招软件组考点之一)
- 杰理之GSENSOR【篇】
- 爱企查青龙可跑 一个月一张爱奇艺月卡最细教程
- Unity Monetization 3.0 部分接入文档内容
- SpringCloud Gateway 重试路由器的过滤器
- 微信页面触发返回按钮回到聊天界面
- 详解TCP/IP协议栈面临的五大网络安全问题
- winform 三层(BLL.DAL.MODEL)
- 剪刀石头布java_java编写剪刀石头布游戏
热门文章
- 南京计算机与软件学院,南京信息工程大学 计算机与软件学院 刘 琦
- L3-012 水果忍者 (30 分)
- m,mm,mmm区别
- web前端常用网址大全
- HTTP洪水Gong击网站-演示
- ROS 相关学习资源汇总
- php 图片压缩旋转,移动端图片上传旋转、压缩问题的解决方案
- 公安网络及计算机信息系统安全,违反公安网络和信息安全保密工作规定及公安机关有关公安网络、计算机和信息应用系..._考试资料网...
- 三维重建算法综述|传统+深度学习
- vc 2005 express使用