内存泄露分析

简介: .准备工具:windbg 2.准备环境:需要设置windbg符号路径 内存泄露分析demo   [cpp] view plaincopy int _tmain(intargc, _TCHAR* argv[])   {      while(TR...

.准备工具:windbg

2.准备环境:需要设置windbg符号路径

内存泄露分析demo

 

[cpp]  view plaincopy在CODE上查看代码片派生到我的代码片
  1. int _tmain(intargc, _TCHAR* argv[])  
  2. {  
  3.    while(TRUE)  
  4.    {  
  5.       char *p = newchar[1024];  
  6.       memset(p, 0, 1024);  
  7.       Sleep(1000);  
  8.    }  
  9.    return 0;  
  10. }  



 

 

3.利用工具umdh(user-mode dump heap)分析


3.1设置gflags.exe标志

r

 

 

Gflags标志设置好后,开启cmd

 

键入要定位内存泄露的程序gflags.exe /I memroyleak.exe(程序名称)+ust

如图成功后,开启memoryleak.exe程序

3.2利用umdh创建heap快照

 

命令格式:umdh–pn:memoryleak.exe(程序名称) –f:snap1.log(日志名称)

程序运行一段时间后或者程序占用内存增加时,将memoryleak.exe退出。

然后再次创建heap快照,命令行无差别,snap1.log改为snap2.log或者其他。

设置好程序的符号路径,如下图

 

设置好后可以开始分析heap前后两个快照的差异

 

分析差异命令:umdh –d snap1.log snap2.log –f:result.txt

 

分析完成后查看结果result.txt

 

红色为umdh定位出来的泄露点,我们在查看源代码

 

这样我们就可以修改代码中内存泄露的地方了。

 

4.Windbg手动分析内存泄露

4.1全局标志设置,参照3.1

4.2.Windbg调试泄露

开启memoryleak.exe程序,windbg attach到该进程

 

命令:!heap –s查看当前进程运行的所有堆的情况

然后F5让程序运行一段时间或者内存有明显的增加时再次通过!heap –s查看当前堆的变化

如下图

 

通过对比前后两个堆的变化,发现0x012800000该地址的堆增加的很快而其他堆没什么变化

下面进一步定位

 

命令:!heap –stat –h 查看对应对的状态,发下该堆的内存基本被长度为0x424的块占用,接下来我们在堆中搜索该进程中哪些模块占用0x424长度内存,如下图

 

命令:!heap –flt s 424

通过搜索程序内存中的堆发现长度为424的堆被大量的占用,进一步查看时谁在使用这个地址

 

找到泄露点了,红色部分的,如果程序对应的符号对应我们可以查看内存泄露点在哪一行

 

内存泄露分析结束,如果你还有什么好的方法可以共享

技术改变世界! --狂诗绝剑
目录
相关文章
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
12月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
732 3
|
8月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
212 1
|
11月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
772 4
AI代理内存消耗过大?9种优化策略对比分析
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
297 2
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
732 159
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
152 4
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
283 2
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
646 1