理解UMDH比较输出

背景

我build立了一个testing工具来testing我正在为一个项目开发的DLL中的一组函数。

我想validation这些函数在Windows系统上有零内存泄漏。

我已经正确设置了UMDH,并且能够获得两个Heap转储之间的比较文件。 即使堆栈的痕迹显示正常。

问题

从差异的输出拼图我和我希望有人可以帮助解释为什么我得到我得到的输出。

比较日志的输出:

+ 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和发布版本的好处。

如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工具轻松读取比较输出。

屏幕截图