gpt4 book ai didi

c++ - 理解 UMDH 比较输出

转载 作者:可可西里 更新时间:2023-11-01 13:23:43 25 4
gpt4 key购买 nike

背景

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

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

我已经正确设置了 UMDH,并且能够在两个堆转储之间获取比较文件。甚至堆栈跟踪也显示正常。

问题

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

比较日志的输出:

+      56 (     56 -      0)      1 allocs  BackTrace9C160
+ 1 ( 1 - 0) BackTrace9C160 allocations

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

的确,它只显示了 1 个分配,但是,它说前后有 56 字节的变化。我只希望 sizeof(int) 以字节为单位发生变化。在我的系统上,int 分配的大小是 4 个字节,所以我期望看到 +4,而不是 +56。

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

new int; //purposely leak memory

有什么解释吗?

附加信息:

IDE/编译器:Visual Studio 2010

应用程序是 64 位

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

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

解决方案

请参阅下面的 SleuthEye 解决方案。这也是我添加的评论作为对解决方案的评论,我认为这对最终使用这个问题的人是有益的:

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

最佳答案

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

查看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

关于c++ - 理解 UMDH 比较输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26867331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com