问题标签 [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 版本与 Delphi XE 默认版本
我们在 Delphi XE 中处理 3rd-party 组件线程代码的方式一直遇到问题。我说 3rd-party 是因为我们的核心应用程序本身并没有实现任何多线程代码。我确定的是,如果我使用 SimpleShareMem(我们有几个与主应用程序共享字符串数据的 dll)会发生奇怪的内存损坏,但如果我安装 FastMM4 单元,这些错误就会消失。奇怪的是,我的意思是错误很少连续两次相同,尽管它们在同一个大范围内。我最初安装 FastMM4 是为了尝试确定错误的原因,但实际上它们在安装时根本不会发生。我在选项集中设置了条件,允许我在 SimpleShareMem 和 FastMM 之间来回翻转项目组中的所有模块,
我的直接例子是 TRichView。我发现当我使用 hunspell 拼写检查器时,我可以通过同时粘贴和单击向上滚动很多次来在 PaintBuffered/PaintTo 过程中或附近产生错误(这取决于我需要多少次这样做会产生错误)。有时它是一个外部异常,它解决了一个浮出水面的异常,有时我在异常处理代码中遇到堆栈溢出。
我遇到的另一个例子是 AnyDAC (DA-SOFT) 远程/文件监控系统,它也在一个单独的线程中运行,它不能与 SimpleShareMem 一起使用,但与 FastMM4 一起工作正常。
基于这些经验,我不得不使用 FastMM4 单元进行生产构建,这对我来说可能看起来很奇怪。当然,我总是首先怀疑我自己的代码,所以我想知道是否有什么我可以做的事情来加剧这个问题,尽管 FastMM4 并没有显示主应用程序有任何堆栈损坏等。
所以,我的问题是,谁能想到为什么 FastMM4 比 Delphi XE 使用的任何版本的 FastMM 更适合多线程操作的原因?
更新:我想补充一点,我现在已经使用旧的 Sharemem/borlndmm.dll 概念进行了一些测试,而且效果也很好。
更新 2:感谢您的建议。我一直试图找到导致我的问题的 heisenbug,但收效甚微。我确实有一个额外的观察。
如果我修改主应用程序使其不加载需要 ShareMem 的 DLL,那么无论我使用何种内存管理器,AnyDAC 日志记录或 TRichView 都没有问题。即使我没有调用该 dll,加载该 DLL(它启动 FastMM 的初始实例并与主应用程序共享)的行为也会导致问题。我要做的下一件事是修改主应用程序以启用该 dll 的动态加载(从而强制将内存管理器安装到主应用程序中)并查看是否有所不同。
更新 3:动态加载 dll 与不加载它的效果相同......一切正常。
delphi - 如果我没有在完全调试模式下使用 FastMM4,它是否比 Delphi XE2 中的内存管理器更快?
我使用 FastMM4,通常在开发期间处于完全调试模式。如果我关闭此模式,我应该安排我的应用程序返回到 Delphi (XE2) MM,还是让 FastMM4 一直保持链接有性能优势?
delphi - 如何在 FastMM4 中启用完全调试模式?
我不知道如何使用 FastMM。我从SourceForge下载了它,并将 FastMM4Messages.pas 和 FastMM4.pas 放在我的 dpr 文件的顶部。
我现在调用这个过程来泄漏一些内存:
并收到此消息
如何启用这些 FullDebugMode 和 LogMemoryLeakDetailsToFile 开关?
delphi - 有没有办法以编程方式判断 FastMM 是否没有释放特定的内存块?
我正在尝试检测是否未释放内存块。当然,经理通过对话框或日志文件告诉我,但如果我想将结果存储在数据库中怎么办?例如,我想在数据库表中有一个分配给定块的例程名称。
在阅读了 FastMM 的文档后,我知道从 4.98 版开始,我们有可能在发生内存分配、释放和重新分配时收到管理器的通知。例如OnDebugFreeMemFinish
,事件传递给我们一个PFullDebugBlockHeader
包含有用信息的事件。缺少一件事PFullDebugBlockHeader
- 给定块是否被应用程序释放的信息。
除非OnDebugFreeMemFinish
只为未释放的块调用?这是我不知道并想知道的。
问题是即使连接到OnDebugFreeMemFinish
事件我也无法确定块是否被释放。
这是一个例子:
我缺少的是回调,例如:
浏览了FastMM的源码后看到有一个程序:
这可以被覆盖,但也许有更简单的方法?
delphi - 什么可以解释 FastMM 或 GetProcessMemoryInfo 报告的内存使用差异?
我的 Delphi XE 应用程序基于使用 RemObjects 创建的本地服务器 DLL 的单个 EXE,并为特定操作使用大量内存,直到它生成一个异常说没有足够的内存。因此,我试图了解发生这种情况的原因和位置,因此我在代码中放置了各种步骤,报告内存使用情况。问题是,根据用于获取内存使用信息的方法,我得到的信息非常不同:
如果我使用这里解释的方法,直接向 FastMM 询问客户端 EXE 和服务器 DLL,我得到的是:
- 第 1 步:[客户端] = 36664572 - [服务器] = 3274976
- 第 2 步:[客户端] = 62641230 - [服务器] = 44430224
- 第 3 步:[客户端] = 66665630 - [服务器] = 44430224
现在,如果我使用这里解释的使用 GetProcessMemoryInfo 的方法,我会得到更多的内存使用:
- 第 1 步:[流程] = 133722112
- 第 2 步:[流程] = 1072115712
- 第 3 步:[流程] = 1075818496
根据我的记忆问题,看起来第二种方法是正确的,但 FastMM 方法怎么会如此“低”?什么可以解释差异?
delphi - 我应该在我的 Delphi 6 应用程序安装文件中提供 FastMM 包含文件吗?
我在我的 Delphi 6 应用程序中使用 FastMM4。我是否需要将包含文件 (FastMM4Options.inc) 与我创建的安装文件一起提供以在用户 PC 上安装我的应用程序?如果是这样,我应该把它放在我放置主 EXE 文件的同一目录中吗?
我指的是在运行时控制 FastMM 设置的 FastMM 包含文件。目前,此文件位于可通过我的 Delphi IDE 环境选项中指定的库路径访问的目录中,但我从未考虑将其包含在我的安装程序中。
delphi - 除了寻找内存泄漏之外,是否存在在销毁应用程序时我应该释放所有对象的另一种情况?
假设一个具有一些表单的应用程序在开始时只创建了一个数据模块。在这种情况DM1.OnCreate
下,将TStringList
创建 a 以在运行时使用。我们知道,当应用程序被终止时,所有东西都会被销毁,内存会自动释放。释放某些东西可能需要一些时间,因此并不总是建议担心关机时的内存泄漏。例如,参见Barry Kelly的这个答案或 Raymond Chen的这篇文章。
除此之外,如果我不添加TStringList.Free
到DM1.OnDestroy
. 在搜索我真正应该担心的任何其他内存泄漏时,这成为一个问题。
所以基本上我在问我是否/为什么/何时应该释放将由应用程序或操作系统(在这种特定情况下为 Windows)释放的对象实例。在寻找内存泄漏时是否还有其他有效案例?
注意:在这种特定情况下,不会多次创建或重新创建数据模块。除了一个之外,根本不会有任何内存泄漏。数据模块报废来源:
delphi - FinalBuilder 服务器 + FastMM4 示例
使用 FinalBuilder Server 进行持续集成时 - 运行一套单元测试并基于 FastMM 内存泄漏检查建立构建通过/失败的推荐方法是什么?
delphi - FastMM4,如何读取日志文件?
我正在开发一个软件,所以我刚刚开始在我的项目中使用 FastMM4(真正的)。
我在网上找到了有关如何获取line number
FastMM4 的信息,我得到了行号,但我可以弄清楚日志中的其他信息是什么意思?
我在日志文件中有这个
在这leak
就是
我的代码
这是call stack
我在网上搜索,但我不知道其他检测是什么......
我正在使用delphi 2006
我也打开并尝试delphi 6, delph 7
过
检查 我发现这与 fastMM$ 检测和一些已经在 delphi 中的泄漏的注册有关。 如何使用 fastMM 追踪棘手的内存泄漏? 这用于注册泄漏,但它们是错误吗? 使用 FastMM4,如何注册泄露的字符串?
还有FastMM4、Delphi6、TApplication 的泄漏?
或者are they just the steps leading to the memory leak?
delphi - FastMM 是否只报告内存泄漏和/或内存分配?
我正在使用 FastMM 调试我的程序,它报告的许多内存泄漏似乎是合法的内存分配,而不是实际的内存泄漏。
例如,
TConnObj 是经常用于创建对象并在程序不再需要时销毁的类。但是,FastMM 报告它是实际的内存泄漏。那么,在查看 FastMM 内存泄漏日志文件时,如何判断哪个是哪个?