1. 背景 在开发过程中,我们可能遇到应用程序线程占用过大的问题,可以通过windbg命令去定位哪些类型,哪些内存一直占用堆资源,从而查出问题,解决问题. 2. 准备工作 工具: 抓取DUMP文件的工具,任务管理器(最简单),DebugDiag,ProcessExplorer等(网上很多) 分析工具windbg PS:使用任务管理器的时候需要强调一下如何抓包:根据你的进程是多少位的,然后使用对应位数的任务管理器去抓, 不然抓到的DUMP文件是无效的. 如果在下面分析过程中出现"SOS does…
1.简单配置在windbg程序目录下有个gflags.exe,运行后设置: 运行CMD.EXE,输入"D:\Debugging Tools for Windows (x86)\gflags.exe" /i test.exe +ust,如果设置成功则显示: 如果设置失败,说明注册表被禁用了,可以尝试解除所有对注册表的禁用.这个注册表位置为:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File…
A.利用工具umdh(user-mode dump heap)分析:此处以程序MemoryLeak.exe为例子 1.开启cmd 键入要定位内存泄露的程序gflags.exe /i memroyleak.exe +ust,如图成功后,开启memoryleak.exe程序. 2.利用UMDH创建Heap快照                  命令格式:umdh -pn:memoryleak.exe -f:snap1.log 程序运行一段时间后或者程序占用内存增加时,然后再次创建heap快照,命令行…
FastMM 定位内存泄露的代码位置 开源的FastMM,使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告. 在Delphi2007以后版本中,使用更加简单,只需要在工程开始的位置加上语句: ReportMemoryLeaksOnShutdown := True;就可以了,并且在运行时不会出现提示.如果想要生成文件报告,还需要FastMM4,Delphi中没有别的设置可以生成文件报告. 可以修改FastMM4…
一谈到内存泄露, 多数程序猿都闻之色变. 没错, 内存泄露非常easy引入. 但非常难定位.  以你我的手机为例(如果不常常关机). 如果每天泄露一些内存, 那么開始的一个星期, 你会发现手机好好的. 当内存泄露积累到一定程度,  那就是各种卡死了. 系统异常, 最后死机. 不得不重新启动. 假设搞开发. 遇到内存泄露问题, 那就呵呵了. 你可能先得花好几天来复现问题(泄露积累), 然后须要花好几天来定位问题和改动问题, 然后又要花好几天来验证问题, 并且. 非常有可能没法一次改好, 上述流程又…
介绍一款在vs2015开发环境定位内存泄漏工具:Visual Leak Detector ,具体的使用方法如下: 1.  安装vld-2.5-setup.exe (下载链接地址后面会给出),安装过程会出现以下界面,所以复选框均 选中. 图1 vld安装显示界面 2. 利用 vs2015新建一个控制台程序,代码如下图所示: 图2 示例代码片段 如图2所示,只要将vld头文件引入到工程即可.vld.路径以及vld动态库VS2015可自动找到,不需要指定路径. 程序运行的结果如图3所示: 图3 程序运…
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在Windows平台,服务器和客户端开发人员惯用的调试方法有很大不同.下面结合我的实际经验,整理下常见定位内存泄漏的方法. 注意:我们的分析前提是Release版本,因为在Debug环境下,通过VLD这个库或者CRT库本身的内存泄漏检测函数能够分析出内存泄漏,相对而言比较简单.而服务器有很多问题需要在线…
一.背景 近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高, 虽然偶尔还会往下降一些,但是总体还是不断上升:内存运行6个小时候从33M上升到80M: 程序存在内存泄漏是确定无疑的了,大概出问题的方向也知道,就是程序新加入一个采集协议(BACnet协议,MSTP_DLL), 但是怎么把具体泄漏位置找出来却非常麻烦,因为这个协议是封装在一个C语言写的动态库中,想要单步调试好像不太可能, 况且源码也不再我这里: 如果到此为止,推脱给其他同事找问题,那联…
项目介绍:asp.net mvc + angular +iis(windows)+windows server 系统莫名崩溃 最近有个系统默认奇妙崩溃50x,服务整体变成无响应,当运维告知我只有重启应用程序池项目才能正常. 我问他如何重现,得到的回复是我这里无法重现,但客户使用一段时间后,就会崩溃. 于是我崩溃了.因为查日志没有任何错误,查windows系统日志上也只有一个错误 System.AccessViolationException 尝试读取或写入受保护的内存.这通常指示其他内存已损坏,…
1.首先,java程序启动在linux,怎么生成dump文件? 1>第一步,首先你需要得到java程序的PID,最简单的方法使用如下命令 ps -ef|grep java 或者如果是docker启动的  springboot服务,也可以使用本命令: 2>在任意位置,执行jmap命令,生成dump文件 jmap -dump:format=b,file=serviceDump.dat jmap -dump:format=b,file=serviceDump.dat [java进程的PID] 可以看…