首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UMDH比较输出的意义

UMDH比较输出的意义
EN

Stack Overflow用户
提问于 2014-11-11 14:36:21
回答 2查看 1.2K关注 0票数 6

背景

我已经建立了一个测试工具来测试我正在为一个项目开发的DLL中的一组函数。

我想验证这些函数在windows系统上是否有零内存泄漏。

我已经正确地设置了UMDH,并且能够在两个堆转储之间获得一个比较文件。连堆栈痕迹都显示得很好。

问题

来自diff的输出令我困惑,我希望有人能帮助我解释为什么我得到了我得到的输出。

比较日志的输出:

代码语言:javascript
复制
+      56 (     56 -      0)      1 allocs  BackTrace9C160
+       1 (      1 -      0)    BackTrace9C160  allocations

我将log1和log2设置为1整数分配,只是为了验证我的设置。

实际上,它只显示了一个分配,然而,它是说,有一个56字节的变化,从前和后。我只期望以字节为单位进行较大的(Int)变化。在我的系统上,int分配的大小是4个字节,所以我希望看到的是+4,而不是+56。

同样,在日志之间运行的唯一代码行是

代码语言:javascript
复制
new int; //purposely leak memory

有什么解释吗?

附加信息:

IDE/编译器: Visual 2010

应用程序为64位

涉及一个DLL (但在这个简单的int分配示例中,我甚至没有调用它)

如果我注释掉泄漏,就会得到零分配和+0字节。因此,我认为这可以验证没有额外的字节来自应用程序中的任何其他地方,仅仅是从上面所示的1行.

解决方案

请参阅下面的侦察眼的解决方案。此外,我还补充了一条评论,作为对解决方案的评论,我认为这对最终使用这个问题的人是有益的:

此外,如果您在.exe的发布版本上运行此程序,并且在运行目录中还包括程序调试数据库,那么umdh将提取源文件名和内存泄漏的行号,同时保持准确的字节计数。这为您提供了调试和发布版本的好处,只要进行内存泄漏搜索。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-12 03:48:12

这56个字节是C运行时库(CRT)在使用调试堆时分配的额外内存造成的,如MSDN所述。

查看dbbint.h,其中_CrtMemBlockHeader结构定义为:

代码语言:javascript
复制
#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 )产生以下比较日志输出:

代码语言:javascript
复制
+       4 (      4 -      0)      1 allocs  BackTrace2
+       1 (      1 -      0)    BackTrace2  allocations
票数 4
EN

Stack Overflow用户

发布于 2015-06-19 12:59:13

您可以使用迪夫·维兹工具轻松地读取比较输出。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26867331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档