问题标签 [fastmm]
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.
delphi - 这是怎么内存泄漏的?
FastMM 将此行报告为内存泄漏的来源:
Copy
和怎么了MidStr
?这只是Delphi 2007编译器的bug,还是以后的版本也有这个问题?这是FastMM 报告副本的链接,以及我的应用程序如何显示这些类型的报告的图像。看,为了显示节点,VirtualTreeView
我需要一个新的数据类型。我称之为 TMemoryLeak。当我解析报告时,我给出了我TMemoryLeak
的类名、调用堆栈、它的大小等。但是当应用程序关闭并且 FastMM 启动时,上面的复制行似乎泄漏了内存。我取消分配调用堆栈的大小,整个对象,但是作为字符串的 ClassName 字段总是会占用内存。
更新(来自评论)
这是声明和构造函数和解构函数。至于生命周期 - 一旦对象用于显示节点树,就会调用对象的解构函数,之后它们就过时了,并且被释放(我希望如此)。
delphi - 知道使用 FastMM 分配内存的位置
我正在尝试使用 Delphi 7 调试大型应用程序中的内存使用情况。我能够安装 fastmm debug full dll 并解决一些泄漏问题。
我还安装了内存使用跟踪器,让我可以查看分配了哪些块以及它们的大小。
我的问题是,有没有办法找出块的分配位置?我知道这是可能的,因为如果没有释放内存,则会打印堆栈跟踪。有没有办法“戳”fastmm 让它打印给定分配的堆栈跟踪?
附带问题:如果知道分配的起始地址,有没有办法找出对象是哪个类?(假设分配是针对一个对象的。
algorithm - 对快速多极方法实施的建议?
我有兴趣实施快速多极方法来有效地模拟排斥粒子系统。
我找到了大量讨论 FMM 的参考资料,但对于想要完全理解该算法的非数学家来说,似乎没有一个非常容易理解。
您能否推荐一个清晰地解释该过程背后的数学原理并包含示例正确实现的伪代码的基础参考?
delphi - 什么会导致 delete 循环 Sleep()ing 并且永远不会在 Borland / Embarcadero RTL 中返回?
我有一个奇怪的错误,当删除一个特定对象时,delete
永远不会返回。相反,它似乎花时间Sleep()
在一个永久循环中调用。这是调用堆栈:
运行时,它返回SysFreeMem
(从不返回)并再次从内部free
调用,永久循环。Sleep
SysFreeMem
我的代码非常简单:它是一个 VCL 事件处理程序,一个微调框刚刚更改,一个设置对象更新,并且它所做的临时设置正在被删除:
这段代码一两年没有改变,设置类也有一段时间没有改变,它基本上是一个包含许多设置的巨大的类似结构的对象。它有一个编译器生成的析构函数。单步执行代码显示了一些删除字符串和其他 std:: 对象的调用,然后在单步执行下一个函数(即在 IDE结束时~basic_string()
,在右大括号处按 F7 )时,它似乎冻结了}
从不显示。冻结是它在 Sleep() 中。此代码在主线程中运行。
我尝试使用 CPU 视图来推断调用 Sleep() 的延迟,但无法发现它 - 恐怕我还没有完全掌握 x86 汇编代码。
另一个线程在里面Sleep
,可能与 COM 相关(该应用程序是一个 COM 服务器,尽管目前没有使用 COM)。它的整个调用栈是:
另一个线程正在做某事并主动分配和释放内存并调用Sleep()
- 一个后台任务正在运行,它正在检查它是否需要工作(它不必)并且正在休眠 100 毫秒以再次检查。分配和免费用于文件夹路径的字符串。虽然程序中还有其他线程,但它们都被阻塞等待做某事,这次使用WaitForSingleObject
或类似的。此后台任务线程每 100 毫秒唤醒一次(从睡眠中返回);我没有看到(还没有!)它如何影响另一个线程的delete
.
据我所知,没有其他线程正在删除或分配任何东西。CC32100MT._malloc
我在,CC32100MT._free
和中放置了断点CC32100MT._realloc
。运行时没有其他线程中断,当暂停检查时,没有其他线程在任何这些调用中。
删除循环而不返回的原因可能是什么?
我正在使用: * RAD Studio 2010,完全更新 * 应用程序主要是 C++(C++ Builder),带有少量 Delphi。* 因为它使用的是 Embarcadero RTL,所以我认为它使用的是 FastMM
我添加了 Delphi 标签,因为它使用 Embarcadero RTL 和 FastMM,Delphi 人使用的次数比 C++ 人多得多。
delphi - RTL 和 VCL 内存泄漏
我在FullDebugMode中使用 FastMM4来查找内存泄漏,我收到了很多关于UnicodeString
, TList
,TParameters
等实例的投诉,如下所示:
我目前的内存泄漏报告大约有两兆,而且它的大部分内容都是这样的。怎么了?我应该担心它们RTL
的VCL
内部结构和可能的内存泄漏吗?如果是,我能对他们做些什么?
delphi - 如何注册ExpectedMemoryLeak
让我们从 D2010 下的简单代码开始:
FastMM4 一次又一次地报告内存泄漏,即使使用Addr(StringList)
参数,所以如何注册预期的 MemoryLeak 以及为什么上面的方法不起作用提前谢谢。
delphi - 汇编中的GetThreadID
我阅读了 FastMM4 的源代码,并注意到了这个有趣的功能
我已经对其进行了测试,并且它有效,所以我的问题是任何解释它为什么有效?
delphi - 以多个名称导出相同的 DLL 函数
我在我的 DLL 中创建了一些函数,如下所示:
然后我以 2 个名称导出它:
在大多数情况下,这种“重命名”有效。但至少在一种情况下,重命名的函数“DoThat”不会从真实文件中读取数据,而是从 void 中读取数据。如果我在同一个文件上调用 DoThis - 它效果很好。由于 FastMM4,我删除了所有内存泄漏(将代码转换为常规控制台应用程序)
所以问题是:
这种“更名”不合法吗?
如果它是合法的 - 我可以使用 FastMM4 调试 DLL 而不将其更改为控制台应用程序吗?
delphi - 如何配置 FastMM 以检测 dll 中的内存泄漏
我不知道如何检测静态甚至动态链接的 dll 中的内存泄漏。我只想检测 dll 中的泄漏,我不想在 dll 和应用程序之间共享内存管理器。此外,该 dll与运行时包链接
我的示例 dll 如下所示:
应用程序 dpr:
注意:如果我取消注释 fastmm4,我可以检测到由应用程序 (TStringList.Create) 引起的 memleak,但不能检测到 dll 中的泄漏。
并在应用程序主单元中:
我希望 FastMM 在调用 FreeLibrary 时或在程序退出时生成报告,如果静态加载 dll,但没有任何反应。
在FastMM4Options.inc
我另外只设置了FullDebugMode和ClearLogFileOnStartup,并且FastMM_FullDebugMode.dll在输出目录中。
我在 github 上创建了一个存储库。我错过了什么?
delphi - FastMM 报告记录线程变量的内存泄漏
FastMM 报告以下代码片段的内存泄漏 (UnicodeString),该代码片段使用带有字符串的记录线程变量:
这是真正的内存泄漏,还是在 FastMM 检查内存泄漏后才清理线程变量?
更重要的是:我如何才能抑制报告这些“内存泄漏”,因为它们会混淆可能发现的任何其他内存泄漏?