背景
我build立了一个testing工具来testing我正在为一个项目开发的DLL中的一组函数。
我想validation这些函数在Windows系统上有零内存泄漏。
我已经正确设置了UMDH,并且能够获得两个Heap转储之间的比较文件。 即使堆栈的痕迹显示正常。
问题
从差异的输出拼图我和我希望有人可以帮助解释为什么我得到我得到的输出。
无法使用Windows 7或Windows Server 2008(64位)从COM +目录导出32位ServicedComponent
替代caprock.dictionary 64位Windows / IIS 7.5
运行theano时编译问题
SetupDiCallClassInstaller的等价API来卸载我的调制解调器
在64位Windows 7(msys2 / mingw64)上构buildGMP 6.1.0:由于mp_limb_t的configuration失败,不是64位
比较日志的输出:
+ 56 ( 56 - 0) 1 allocs BackTrace9C160 + 1 ( 1 - 0) BackTrace9C160 allocations
我设置log1和log2为1整数分配,只是为了validation我的设置。
实际上,它只显示1个分配,但是,这是说前后有56字节的变化。 我只会期望sizeof(int)以字节为单位的变化。 在我的系统中,int分配的大小是4个字节,所以我期待看到+4,而不是+56。
同样,在日志之间运行的唯一代码行是
new int; //purposely leak memory
任何解释?
附加信息:
IDE /编译器:Visual Studio 2010
应用程序是64位
涉及一个DLL(但我甚至没有在这个简单的int分配示例中调用它)
如果我注释泄漏,我得到零分配和+0字节。 所以我认为,validation没有额外的字节来自应用程序的其他任何地方,只是从上面显示的1行…
解
请参阅下面的Sleutheye解决scheme。 这里还有一条评论我join了对解决scheme的评论,我认为这对最终使用这个问题的人是有益的:
此外,如果您在.exe的发行版本上运行此程序并在运行目录中包含程序debugging数据库,则umdh将在保持精确的字节数的同时拉取源文件名和内存泄漏的行号。 就内存泄漏search而言,这将为您提供debugging和发布版本的好处。
当ZMQ_FD option_val的本地地址传递时,zmq_getsockopt在windows x64上返回EINVAL
UMDF驱动程序的回环操纵杆设备
64位python 2.5 / 2.6 + windows 7“导入套接字”DLL加载错误
为什么x64项目使用16的默认包装alignment方式?
虚拟服务器/ EC2上的32位和64位操作系统
如MSDN上所述,使用调试堆时,由C运行时库(CRT)分配的额外内存产生56个字节。
查看dbbint.h,其中_CrtMemBlockHeader结构被定义为:
#define nNoMansLandSize 4 typedef struct _CrtMemBlockHeader { struct _CrtMemBlockHeader * pBlockHeaderNext; struct _CrtMemBlockHeader * pBlockHeaderPrev; char * szFileName; int nLine; #ifdef _WIN64 /* These items are reversed on Win64 to eliminate gaps in the struct * and ensure that sizeof(struct)%16 == 0,so 16-byte alignment is * maintained in the debug heap. */ int nBlockUse; size_t nDataSize; #else /* _WIN64 */ size_t nDataSize; int nBlockUse; #endif /* _WIN64 */ long lRequest; unsigned char gap[nNoMansLandSize]; /* followed by: * unsigned char data[nDataSize]; * unsigned char anotherGap[nNoMansLandSize]; */ } _CrtMemBlockHeader;
随后是分配给你的int的内存,然后是一个额外的4字节“NoMansLand”缓冲区。 因此,对于一个64位的应用程序,单个int测试用例的总分配内存sizeof(_CrtMemBlockHeader)+sizeof(int)+4 = 48+4+4 = 56 。
请注意,在发布版本(未分配_CrtMemBlockHeader地方)上运行相同的分析会生成以下比较日志输出:
+ 4 ( 4 - 0) 1 allocs BackTrace2 + 1 ( 1 - 0) BackTrace2 allocations
您可以使用UMDH Diff Viz工具轻松读取比较输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。