当前位置: 首页 > news >正文

潍坊网站建设 潍坊做网站/产品推广平台

潍坊网站建设 潍坊做网站,产品推广平台,要怎么判断网站是什么cms做的,电子产品东莞网站建设小木发现线上的程序通过任务管理器发现内存不断的增长,怀疑是不是内存泄漏呢?用户态内存泄漏可能是句柄泄漏,堆内存泄露,Socket, GDI对象等等。而对于C程序员来说,碰到最多的无疑是堆内存泄露:也就是通过ma…

小木发现线上的程序通过任务管理器发现内存不断的增长,怀疑是不是内存泄漏呢?用户态内存泄漏可能是句柄泄漏堆内存泄露SocketGDI对象等等。而对于C++程序员来说,碰到最多的无疑是堆内存泄露:也就是通过malloc或者new从堆上申请的内存,使用完成后,并没有释放,导致程序使用的内存越来越多。

小木找到了一个分析利器UMDH: 这也是Windbg工具集中的其中一个利器,它可以在一个时间点记录程序的当前程序使用的堆内存申请的信息,过一段时间后再记录一次程序使用的堆内存申请的信息,然后比较两次的结果来找到这段时间内增加的堆内存及其关联的函数调用栈,从而查找内存泄露。为了分析问题,小木先尝试着写了以下测试程序, 熟悉下工具的使用。程序每隔十秒钟调用一次MemorLeakFunction ,在函数中每次会从堆上申请一段内存空间,并且没有释放。

#include #include #include void MemoryLeakFunction(){  const int STR_SIZE = 100;  char * pStr = new char [STR_SIZE];  strcpy_s(pStr, STR_SIZE, "Memory Leak Sample");  std::cout << pStr << std::endl;}int main(){  while (true)  {    MemoryLeakFunction();    std::this_thread::sleep_for(std::chrono::seconds(10));  }  return 0;}

第一步小木先使用gflag(这个也是Windbg工具集中的一个重要工具,主要用于修改系统的配置来达到调试的目的)。以下命令可以对MemoryLeak.exe程序申请堆上内存的时候记录其函数调用栈。"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags" -i MemoryLeak.exe +ust。直接运行gflags图形化界面打开如下图, 开启Create user mode stack trace database2e61b25948881ecadd2904f03cdf345b.png

第二步 运行测试程序MemoryLeak.exe

第三步 将你程序的symbol文件MemoryLeak.pdb拷贝到mysymbols目录下。运行命令配置Symbol:Set _NT_SYMBOL_PATH=C:\mysymbols;SRV*C:\symbols*http://msdl.microsoft.com/download/symbols

第四步 保存当前程序申请内存的记录,相当于做一个堆内存申请的Snapshot,并且将结果导入到C:\umdhlog\begin.log。运行命令(需要一些时间,请耐心等待哦)"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\umdh" -pn:MemoryLeak.exe -f:C:\umdhlog\begin.log

第五步 等程序运行一段时间后。这个等待的时间根据程序内存泄露的快慢来自行决定,要有足够的时间,来表现出程序使用堆上内存的差异。假设这里等待5分钟左右,再次运行如下命令,将结果导入到C:\undhlog\end.log中: "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\umdh" -pn:MemoryLeak.exe -f:C:\umdhlog\end.log

第六步 最后一步来比较end.logbegin.log内存申请的差异,来找到这段时间内增加的堆内存请求调用栈,并且导入到c:\umdhlog\diff.log。运行命令(有时候运行比较长,可以利用这段时间思考下人生吧):"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\umdh" C:\umdhlog\begin.log C:\umdhlog\end.log -f:c:\umdhlog\diff.log

最后一步 diff.log中可以看到增加的内存申请的函数调用栈,比如这段

+    1194 (  157c -   3e8)     37 allocs  BackTrace1+      2d (    37 -     a)  BackTrace1  allocations  ntdll!RtlpAllocateHeap+2122  ntdll!RtlpAllocateHeapInternal+5E5  ucrtbase!_malloc_base+36  MemoryLeak!operator new+1F (d:\agent\_work\2\s\src\vctools\crt\vcstartup\src\heap\new_scalar.cpp, 35)  MemoryLeak!main+2D (c:\personal\git\beyourbest\cpp\windbgsample\memoryleak\memoryleaksample.cpp, 17)  MemoryLeak!__scrt_common_main_seh+10C (d:\agent\_work\2\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl, 288)  KERNEL32!BaseThreadInitThunk+14  ntdll!RtlUserThreadStart+21

注意里面默认采用的是16进制表示的数量,比如0x1194表示在umdh比较的两个时间段之间,这段函数调用栈申请了4500个字节的堆空间,0x2d表示这之间调用了45次。最关键的部分就是函数调用栈了,里面指明了在memoryleaksample.cpp文件的第17行进行了内存申请。这个时候我们一般对这段代码进行审查,都能够找出内存泄露的原因,比如这里的例子,使用后未释放内存。

小木在熟悉了UMDH的使用后,对线上出现的实际问题进行分析,也很快找到了内存泄露原因。

http://www.jmfq.cn/news/4993399.html

相关文章:

  • css做网站/2023年6月份疫情严重吗
  • 没有网站seo怎么做/优化防疫措施+科学精准防控
  • dede网站地图html/微营销平台
  • 湖南省建设厅城乡建设网站/学开网店哪个培训机构好正规
  • 做电影资源网站手机版/win7优化大师下载
  • 祥云网站建设/内蒙古网站seo
  • 哪个网站亲子游做的好/自动的网站设计制作
  • 商城网站开发项目描述/seo网络优化师招聘
  • 重庆做网站建设公司哪家好/搜索引擎是什么意思啊
  • wordpress首页获取文章的图片/网站建设优化的技巧
  • 做盗版小说网站犯法吗/怎么优化一个网站关键词
  • 管理公司网站建设/网络营销公司经营范围
  • 网站 icp备案/预防电信网络诈骗
  • 电脑课做网站所需的软件/百度推广关键词排名规则
  • 连云港建设网站/百度首页广告
  • wordpress后台加载速度慢/seo站长平台
  • wordpress站点logo设置/在哪里找软件开发公司
  • 临沂网站排名优化/app推广方案怎么写
  • 深圳市建设行业主管部门官方网站/百度竞价冷门产品
  • 官方网站建设专业公司/网站维护的主要内容
  • 贵阳网站设计多少钱/百度一下下载
  • 个人可以做电视台网站吗/社区营销推广活动方案
  • 网站图标用代码代替/百度推广电话客服
  • 济宁网站建设哪家好/近两年成功的网络营销案例及分析
  • 网站制作自己做/推广策划
  • 技术先进的网站建设/新浪体育世界杯
  • 做电影网站用什么格式好/进入百度首页
  • 贵阳网站建设有限公司/百度电脑版网址
  • 网站开发技术概述/站长之家站长工具
  • 重庆企业网站建设报价/app营销策略有哪些