用FastMM检测到程序有内存泄漏后, 生成如下日志文件,但怎样才能定位到发生泄漏的源码位置呢?A memory block has been leaked. The size is: 36Stack trace of when this block was allocated (return addresses):
402AF7 
404F29 
404F54 
4BB948 
7C93B686 [wcsncat]
7C98D8A2 [RtlpNtMakeTemporaryKey]
7C930945 [RtlAcquirePebLock]
7C93094E [RtlAcquirePebLock]
7C930970 [RtlReleasePebLock]
7C933E6F [RtlDetermineDosPathNameType_U]The block is currently used for an object of class: UnknownThe allocation number is: 43381Current memory dump of 256 bytes starting at pointer address 15D7AA0:
01 00 00 00 1A 00 00 00 43 4D 20 52 65 65 73 74 61 62 6C 69 73 68 6D 65 6E 74 20 52 65 71 75 65
73 74 00 00 98 0E 1B 93 00 00 00 00 10 7A 5D 01 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00
73 A9 00 00 F7 2A 40 00 29 4F 40 00 54 4F 40 00 48 B9 4B 00 86 B6 93 7C A2 D8 98 7C 45 09 93 7C
4E 09 93 7C 70 09 93 7C 6F 3E 93 7C 75 4E 40 00 CF 5A 40 00 59 5A 40 00 34 5B 40 00 FE 67 42 00
4B 3F 40 00 D7 A4 51 00 4B 3F 40 00 7B BA 54 00 92 BC 96 7C 20 00 00 00 00 00 00 00 01 F2 E4 6C
01 00 00 00 17 00 00 00 4C 6F 63 61 74 69 6F 6E 20 55 70 64 61 74 65 20 52 65 71 75 65 73 74 00
FE 0D 1B 93 80 80 80 80 00 00 00 00 10 7A 5D 01 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00
74 A9 00 00 F7 2A 40 00 29 4F 40 00 54 4F 40 00 48 B9 4B 00 86 B6 93 7C A2 D8 98 7C 45 09 93 7C
.  .  .  .  .  .  .  .  C  M     R  e  e  s  t  a  b  l  i  s  h  m  e  n  t     R  e  q  u  e
s  t  .  .  ? .  .  ? .  .  .  .  .  z  ]  .  .  .  .  .  .  .  .  .          .  .  .  .
s  ? .  .  ? *  @  .  )  O  @  .  T  O  @  .  H  ? K  .  ? ? ? |  ? ? ? |  E  .  ? |
N  .  ? |  p  .  ? |  o  >  ? |  u  N  @  .  ? Z  @  .  Y  Z  @  .  4  [  @  .  ? g  B  .
K  ?  @  .  ? ? Q  .  K  ?  @  .  {  ? T  .  ? ? ? |     .  .  .  .  .  .  .  .  ? ? l
.  .  .  .  .  .  .  .  L  o  c  a  t  i  o  n     U  p  d  a  t  e     R  e  q  u  e  s  t  .
? .  .  ? €  €  €  €  .  .  .  .  .  z  ]  .  .  .  .  .  .  .  .  .          .  .  .  .
t  ? .  .  ? *  @  .  )  O  @  .  T  O  @  .  H  ? K  .  ? ? ? |  ? ? ? |  E  .  ? |

解决方案 »

  1.   

    这谁看得明白啊,装EurekaLog吧,调试时能检测并定位内存泄漏
      

  2.   

    我是看了这篇文章学用的 http://www.delphibbs.com/keylife/iblog_show.asp?xid=22603
    ---------------------------------------------------
    有了这份报告只不过了解到内存泄漏存在,但是哪里没释放就还需要更进一步地调查。 
    调查的目标有: 
    1.内存块分配在哪个函数里哪段代码。 这个在报告里可以结合内容和调用堆栈来看。前256个字节可以进行分析,推测分配者,调用堆栈就直接指出了分配函数,不过是一些地址,不能直接知道函数名和代码­段。这时候就需要在delphi 
    ide环境下查看二进制内存映像了,就是View CPU功能。 在设定断点并停下后,可以View CPU,在菜单View=>Debug 
    Window=>CPU  快捷键:Ctrl+Alt+C View CPU Window: 
    正中就是内存映像,而且源码也相应地标注好了,左边列的地址就是内存报告中的Call 
    Stack中的地址,翻页找到所对应的代码就知道哪里分配内存了。 2.检查释放内存的地方是否被调用,可以用日志或断点来调试,如果压根就没有释放内存那就补上代码,如果有却没有执行则检查一下执行条件是否正确,如果断点没起­作用很可能是因为代码永远不会被执行(死代码)。
    -----------------------------------------------------确切的说, 就是再通过调试cpu 窗口 来定位,还是没看明白,求助?