问题标签 [crtdbg.h]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
355 浏览

visual-c++ - 如何从托管 C# 代码跟踪 CRT 调试内存泄漏输出的来源?

我正在运行一个用 C# (WPF) 编写的软件,该软件使用了大量本机遗留代码。当我关闭软件时,调试器会继续运行,并且我的调试输出屏幕会打印以下内容:

(我将那里显示的路径更改为“mydir\somedir”)

这些消息可能会持续超过一分钟,直到我从“停止调试”按钮关闭它。

该软件使用许多用 C 和 C++ 编写的库。有几个 C++/CLI 项目作为包装器执行并由 C# 代码使用。

我确实可以访问正在使用的本机源代码,因此我按照 MSDN 中的说明_CRTDBG_MAP_ALLOC搜索并重新定义了new运算符的所有定义,但输出保持不变并且没有显示任何行/文件信息。我什至不确定它是否来自我们的代码。

如何追踪此内存泄漏的来源?有没有办法至少确定是什么文件/项目导致了这种情况?假设这是来自我们的代码,有没有办法使用 C++/CLI 代码来调试它?

0 投票
1 回答
51 浏览

visual-studio - 为什么 CRT 和 VS 内存分析的结果如此不同?

传统上,我使用 CRT 内存报告功能,如下所示:

最近,我使用了 Visual Studio 的内置堆分析工具和快照。在 foo() 之前创建第一个快照,在 foo() 之后创建第二个快照,然后查看 diff 输出。

现在我同时使用了两者并比较了结果。我预计这两个结果几乎相同,如果不完全相同的话。但这种情况并非如此。内存大小差异很大。他们唯一共享的是分配的数量。我不知道该怎么做。我应该如何解释这些结果?造成差异的原因是什么?我应该相信谁?

请注意,无论是否启用堆分析,CRT 结果都是相同的。

0 投票
0 回答
93 浏览

c++ - _CrtSetDbgFlag 未按预期工作:返回 NULL

我在应用程序中添加了以下代码行:

#define _CRTDBG_MAP_ALLOC
#include
#include <crtdbg.h>
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, FILE , LINE )
#define new DEBUG_NEW
#endif

我没有看到在输出文件中检测到任何内存泄漏。我看到下面打印的行:

(null)(-1) : atlTraceGeneral - XML 文件中的错误 1

有人可以解决问题并帮助我解决内存泄漏问题吗

0 投票
0 回答
28 浏览

c++ - VS2008 使用 CRT 堆调试 - CRTDBG 重载 new 和 CERN Root 重载 new 之间的冲突

我试图找出我们的产品存在的内存泄漏问题。我们正在使用带有 CERN 根 5.28/00b 的 VS2008 非托管 C++。我将以下内容添加到包含在所有文件中的标题中:

我还在 main.cpp 中添加了以下内容,其中包括所有文件中包含的标头:

这会导致 _CrtDumpMemoryLeaks() 在退出时正确执行。当应用程序中的特定进程完成时,我还开始显式调用 _CrtDumpMemoryLeaks(),因为这是我怀疑内存泄漏的地方。我得到了“内存泄漏”的转储,但它没有文件路径和行号信息,这些信息会使转储对我更有价值。许多转储条目似乎被认为是泄漏,因为应用程序调用 exit(0) 而没有首先调用关联的析构函数。无法确定实际泄漏的数量。使用文件名和行号信息,我将能够更准确地判断是否存在泄漏,或者只是应用程序在退出时没有破坏它的原因。

在你评论这些没有被销毁之前,代码还有很多清理工作要做,但我们试图首先解决更直接的问题。

我的问题是,当我将以下几行添加到我的代码中时,我认为这是一个建议的修复,我无法构建:

我收到构建错误:

似乎 Root 和 CRTDBG 定义的 new 重载之间存在冲突。如果有人有智慧的话可以帮助我解决这个冲突,以便我可以开始获取文件路径和行号信息,我将非常感激。谢谢你的帮助。

0 投票
0 回答
32 浏览

c++ - CrtDbg 内存检查在卸载 dll 时引发堆栈溢出

我有一个程序,它加载动态库LoadLibrary并使用FreeLibrary. 到目前为止,我已经使用_CrtDumpMemoryLeaks()execute on检查了内存泄漏DLL_PROCESS_DETACH。它有一个强制性缺陷——没有正确检查全局变量。原因是全局变量在DLL_PROCESS_DETACH信号后被销毁。为了解决这个问题,我_CrtDumpMemoryLeaks()用设置_CRTDBG_LEAK_CHECK_DF标志替换。

但在此更改后,内部 crtdbg 函数进入无限递归,以stack overflow异常结束。

我查看了一些函数的内部,它看起来像内部的internal_getptd_noexit()返回,以( ) 结尾。返回的最内部函数是inside 。我不知道这是否与无限循环的原因有关-也许会有所帮助。nullptr__acrt_getptd()abort()per_thread_data.cppnullptr__acrt_FlsSetValue(__acrt_flsindex, reentrancy_sentinel)internal_get_ptd_head()

这种 crtdbg 行为的原因可能是什么?

0 投票
1 回答
27 浏览

c++ - 尝试使用 crtdbg.h 查找内存泄漏时出现问题

我第一次尝试使用 CRT 库来检测内存泄漏。我已经#define _CRTDBG_MAP_ALLOC在程序的请求中定义了。我的程序由类一结构和主要功能组成。在我_CrtDumpMemoryLeaks();最后的主要功能中。我尝试遵循这些说明

我想得到分配数据的行,导致内存泄漏,但我得到这样的输出:

我不会在我的程序中的任何地方退出,它总是在 main 中完成。我没有得到分配号的原因是什么?如果需要,我可以添加我的代码。
谢谢你的帮助。