2010-07-03 67 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