• 【转】使用UMDH查找内存泄漏


      转载出处:http://blog.csdn.net/phiger/article/details/1932141

      Umdh 是 Debugging Tools for Windows 里面的一个工具, 可以从下面链接下载http://www.microsoft.com/whdc/devtools/debugging/default.mspx. UMDH主要通过分析比较进程的Heap Stack trace信息来发现内存泄露的。

      使用 UMDH 
      1.设置_NT_SYMBOL_PATH环境变量,例如用命令行:set _NT_SYMBOL_PATH=C:/WINDOWS/Symbols。把你自己程序的Symbol files (.pdb) 文件放在跟你执行文件同一目录,或者加到_NT_SYMBOL_PATH环境变量里面。
      2.设置gflags,通过命令gflags -i notepad.exe +ust, gflags也是Debugging Tools for Windows里面一个工具程序。也可以敲入Gflags命令,然后通过界面配置,进入界面后选择Image File, 在Image栏写入执行文件的名字,不需要全路径,例如只要输入notepad.exe, 然后按 TAB键,选中Create user mode stack trace database选项,确认。
      转储以捕获
      1.获得要分析的程序的进程号,比如你的进程号是1234,在命令行输入umdh -p:1234 -f: 1234old.log,得到1234old.log文件。
      2.继续运行你的程序,或者说进行你怀疑会有内存泄漏的操作。
      3.间隔一段时间后,输入命令umdh -p:1234 -f: 1234new.log
      4.然后运行Umdh -d 1234old.log 1234new.log > cmp1234.txt
    分析比较结果
      1.cmp1234.txt就是两个时刻的Heap Stack Trace的差别,它类似于以下信息:
      + 5320 ( f110 - 9df0) 3a allocs BackTrace00053 
      Total increase == 5320

      2.接下来就是查找对应的BackTrace,例如上面的意思是说在BackTrace00053处内存增加了5320个字节,在BackTrace00053你将能找到内存泄露处对应的CallStack。

      3.接下来看一下BackTrace00053究竟有什么东西,找到第二个日志文件,在这里就是1234new.log,搜索BackTrace00053, 如果你的Symbol File Path配置正确的话,在BackTrace00053你会发现有类似如下信息:

    00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
    ntdll!RtlDebugAllocateHeap+0x000000FD
    ntdll!RtlAllocateHeapSlowly+0x0000005A
    ntdll!RtlAllocateHeap+0x00000808
    MyApp!_heap_alloc_base+0x00000069
    MyApp!_heap_alloc_dbg+0x000001A2
    MyApp!_nh_malloc_dbg+0x00000023
    MyApp!_nh_malloc+0x00000016
    MyApp!operator new+0x0000000E
    MyApp!LeakyFunc+0x0000001E
    MyApp!main+0x0000002C
    MyApp!mainCRTStartup+0x000000FC
    KERNEL32!BaseProcessStart+0x0000003D
     
          上面就是分配那块内存的Stack trace信息,在这里我们看到实在MyApp!LeakyFunc函数里面有个new操作。以上信息说明,在两个日志时间间隔里面,MyApp!LeakyFunc分配了新的内存,但是还没有释放!
  • 相关阅读:
    如何在Nginx下配置PHP程序环境
    Nginx服务器不支持PATH_INFO的问题及解决办法
    php内置函数分析之str_pad()
    php常用几种设计模式的应用场景
    func_get_args()在php71与php56的区别
    Restful api 防止重复提交
    Game-Tech小游戏专场第二趴,这次帝都见
    入门系列之在Ubuntu上使用MySQL设置远程数据库优化站点性能
    入门系列之在Ubuntu上使用Netdata设置实时性能监控
    叶聪:朋友圈背后的计算机视觉技术与应用
  • 原文地址:https://www.cnblogs.com/MakeView660/p/7760438.html
Copyright © 2020-2023  润新知