上一篇说到怎么用avlogview.exe打开Appverify.exe的文件。下面是我的截图。
这里callstack的顺序是从下到上看的。这里有几个没有文件名和函数名的调用,不过没关系,根据函数从下到上的调用顺序,我们看最上面的那排。 打开我们上一篇中生成的程序的map文件。
在这里分别比较前面三个函数的地址。比较verifier log文件中第一个地址是1129ch.从上到下,最后一个比1129c小的是11268.那么就是函数WinMainCRTStartup函数,即启动函数。分别比较这三个,我们就知道,是winWmainCRTStartup->WinMain->testmemoryleak。不过我用的时候只用找最后一个函数起始地址。即testmemoryleak的地址是1116c.那么指令相对于函数起始地址为111ac-1116c=40. (十六进制)。 它所对应的目录文件为 code.obj.
而obj是一个二进制文件,我们需要借助于生成程序和汇编指令的cod文件来找到源文件发生错误的地址。生成这个文件的方式是在工程中设置,property->configuration properties->c/c++->output Files->Assembler Output,选择要生成的为Assembly, Machine Code and Source (/FAcs)。之后,只用编译文件就可以生成。
打开这个文件,找到它对应的源文件。为code.cpp。但一般不用,因为xx.cod就是由xx.cpp生成的。
再找到testmemoryleak函数。函数下面的指令地址是相对于函数起始地址。前面已经找到指令的地址是40,那么找到这个函数指令中地址为40的指令。可以看到它是new int[10]生成的。前面的号就是源文件的第几行。这里它是第7行。
这样,我们再打开,code.cpp, 找到第7号。
这样,我们就找到了内存泄漏的地方了。