2010-07-03 68 views
1

我使用視覺泄漏檢測器來檢測我的程序中的內存泄漏。當程序運行完畢後,我收到一條斷言,其代碼爲utility.cpp。當Visual Leak Detector的標題被排除在程序之外時,程序將運行並正常退出。視覺泄漏檢測器崩潰

// Get the *real* address of the import. If we find this address in the IAT, 
// then we've found that the module does import the named import. 
import = GetProcAddress(exportmodule, importname); 
assert(import != NULL); // Perhaps the named export module does not actually export the named import? 

我不知道爲什麼assert被觸發。有人有什麼想法可以觸發斷言的情況嗎?

感謝

+0

exportmodule(DLL的名稱)和importname(函數的名稱)的值是什麼?可能是Visual Leak Detector修補DLL的導入表,這可能會解釋這個問題EM。 – Patrick 2010-07-03 20:32:21

+0

感謝Patrick的回覆。我無法調試線路本身。只要我點擊某處(任何地方),斷言窗口就會消失。大多數情況下,我從窗口收到「錯誤」聲音,甚至沒有彈出窗口。現在我已經擺脫了VSD,而是選擇了標準的泄漏檢測。不是理想的解決方案,但在這種情況下,我沒有什麼選擇。 – Samaursa 2010-07-13 22:22:22

+0

該錯誤修復了最新的源代碼。 – KindDragon 2011-06-11 19:31:16

回答

1

我使用OGRE3D + VLD和我同樣的問題! 我使用GetLastError()調試了錯誤代碼: ERROR_PROC_NOT_FOUND,錯誤127:找不到指定的過程。

的好處是,它的作品(與「新的char [20]」測試)如果你註釋掉assertation並重新編譯, 但是如果你忘記調用「刪除食人魔::根:: getSingletonPtr() ;」它不會被檢測到:(

編輯:報告assertations你可以使用這個調試控制檯:

 // Get the *real* address of the import. 
    import = GetProcAddress(exportmodule, importname); 

    if(import == NULL){ 
     DWORD err=GetLastError(); 
     WCHAR buff[2048]; 
     wcsncpy_s(buff, 2048, L"\n============================================\nImport name: ", _TRUNCATE); 
     int i=wcslen(buff); 
     int n=0; 
     //cast to unicode 
     while(importname[n]){ 
      buff[i++]=importname[n++]; 
     } 
     buff[i]=0; 
     wcsncat_s(buff, 2048, L"\nExport module: ", _TRUNCATE); 
     i=wcslen(buff); 
     GetModuleFileName(exportmodule,&buff[i],2048-i); 
     wcsncat_s(buff, 2048, L"\nError code: ", _TRUNCATE); 
     i=wcslen(buff); 
     _itow_s(err,&buff[i],2048-i,10); 
     wcsncat_s(buff, 2048, L"\n============================================\n", _TRUNCATE); 
     report(buff); 
    } 
    //assert(import != NULL); // Perhaps the named export module does not actually export the named import? 

結果將是:

 
============================================ 
Import name: CoGetMalloc 
Export module: C:\data\projects\Avenon\trunk\source\..\build\Avenon_d.exe 
Error code: 127 
============================================ 

============================================ 
Import name: CoTaskMemAlloc 
Export module: C:\data\projects\Avenon\trunk\source\..\build\Avenon_d.exe 
Error code: 127 
============================================ 

============================================ 
Import name: CoTaskMemRealloc 
Export module: C:\data\projects\Avenon\trunk\source\..\build\Avenon_d.exe 
Error code: 127 
============================================ 
+0

嗨Sajty,感謝您的答覆。你是對的,它確實有效,但是如果他們被泄露,食人魔的指針無法被檢測到。它仍然比標準的檢漏儀好。再次感謝! – Samaursa 2010-08-10 02:39:43

+0

更新:它隨機停止再次爲我工作。我已經編譯了發行版和調試版,並同時檢查了兩個版本(註釋掉了斷言),同樣的問題依然存在。最糟糕的是,一個窗口在消失之前顯示一秒鐘,所以我不知道發生了什麼。我調試輸出顯示:在0x7589b727在ProjectName.exe 第一次機會異常:微軟C++異常:OIS ::異常內存位置0x003cf2d4 .. =(...很傷心,因爲它工作時,它可以創造奇蹟 – Samaursa 2010-08-23 07:10:25

+0

嗨!我用了很多,我也使用了OIS鍵盤和鼠標,並且沒有崩潰,如果它也會拋出異常,那麼它不是vld。我使用windows7 system32文件夾中的dbghelp v6.1.7600 0.16385 – Sajty 2010-09-08 14:06:27

1

嘗試使用不同的調試器來檢查我會使用delecker