上一篇說到怎麼用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號。
這樣,我們就找到了內存泄漏的地方了。