问题标签 [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.

0 投票
1 回答
1735 浏览

c++ - 如何将 FastMM 添加到 C++ Builder 项目?

我正在尝试配置FASTMM4Builder C++ 6我遵循的步骤是;

  1. 从sourceforge下载 zip 。
  2. Project -> Options -> Linker我未选中的菜单下"Use Dynamic RTL"
  3. 将内容解压缩C:/tools/FASTMM并将FASTMM4.pas文件添加到我的测试 C++ VCL 项目中。
  4. 只需从 Project 菜单编译单元并FastMM4.hpp在 FastMM 文件夹中获得一个新文件。
  5. 包含FastMM4BCB.cpp在我的项目中的文件,也写#include <FASTMM4.hpp>在顶部。
  6. 添加路径FastMM_FullDebugMode.dllFastMM_FullDebugMode.lib移至安装目录FastMM_FullDebugMode.dll中的Bin文件夹。Builder C++
  7. {$define FullDebugMode}从启用线路FastMM4Options.inc

我错过了什么吗?为什么我会出现以下错误?

链接器错误

0 投票
1 回答
1082 浏览

delphi - Delphi,FastMM - 块在被释放后已被修改 - 需要帮助解释此 FastMM 报告

当我从 IDE 运行它时,我的应用程序在退出时报告此错误。对于程序运行时创建的每个线程实例,我通常会得到一个 FastMM 障碍,但它的可重复性不足以表征这种行为。问题是我无法理解这份报告。

获取项目先前释放时间的堆栈跟踪。

都是明智的,但下一行:404DFF [GIFImage.pas][System][System.TObject.Free][12891] 让我感到困惑。我希望此时会调用 Free ,但是那里在GIFImage.pas做什么?先前分配块的时间是完全随机的。这些项目都没有意义。我感觉 FastMM 设置有问题,或者 FastMM 正在从废弃的内存中获取堆栈跟踪。

我最初在使用 Delphi 2006 编译后遇到了这个问题。全新安装的 Delphi 2007 具有相同的行为。谁能告诉我发生了什么事?TIA R

0 投票
1 回答
324 浏览

delphi - 释放动态数组后阻止页脚损坏

当用户登录服务器并且服务器发送与用户名/密码匹配结果相关的响应时,我遇到了这个错误。具有回复数据包的数组导致错误。我不知道如何解决这个问题,这是我第一次看到这样的错误。

代码

主要方法

fOnLogin 方法

FastMM 日志

0 投票
1 回答
419 浏览

delphi - Delphi XE2 / 64bit 目标地址可以例如 1 TB 的内存吗?

Delphi / FastMM 能否解决与操作系统规范相同的问题? http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

我刚有一位客户问我,我的软件是否可以访问 1 TB(Windows 2008 服务器),这让我很疑惑。

0 投票
3 回答
583 浏览

delphi - 符号中出现额外的“$qqrv”

德尔福 XE3。我正在使用 JCL 错误对话框和 FastMM,在我的应用程序中打开了 FullDebug,并将“垃圾”附加到堆栈跟踪中的符号(JCL 和 FastMM):

当我想要的是:

当应用程序为 Release 编译时。当我为调试编译时,堆栈跟踪是“干净的”。由于我在 FastMM 和 JCL 报告中看到了相同类型的“垃圾”,我认为这两个库都不会造成麻烦。

我说的是带引号的“垃圾”,因为 $qqv 似乎是恒定的,并且字符串的其余部分因运行而异。

我已检查(并重新检查)地图文件和符号设置以及 JCL 符号,但在设置中看不到任何不同。

编辑:毫不奇怪,根本原因是相同的,因为 FastMM 是(我认为)使用 JCLDebug 生成堆栈跟踪......所以修复一个,修复所有。

0 投票
3 回答
2316 浏览

delphi - 如何解决内存分段并强制 FastMM 向 OS 释放内存?

注意:32 位应用程序,不打算迁移到 64 位。

我正在使用一个非常消耗内存的应用程序,并且在内存分配/取消分配方面已经优化了所有相关路径。(没有内存泄漏,没有句柄泄漏,应用程序本身没有任何其他类型的泄漏 AFAIK 并经过测试。我无法触及的第 3 方库当然是候选库,但在我的场景中不太可能)

该应用程序将经常分配包含最多 4 个单曲的单曲和打包记录的大型单维和二维动态数组。大我的意思是5000x5000的记录(单,单,单,单)是正常的。在给定时间甚至有 6 或 7 个这样的阵列在工作。这是必要的,因为在这些阵列上进行了大量的交叉计算,并且让它们从磁盘读取将是一个真正的性能杀手。

澄清这一点后,由于这些大型动态数组在释放它们后不会消失,无论我将它们设置为 0 还是最终确定它们,我都会经常出现内存错误。这当然是 FastMM 为了快速而做的事情,我知道很多。

我正在使用以下方法跟踪 FastMM 分配的块和进程消耗的内存(RAM + PF):

我在 64 位计算机上运行代码,崩溃前的最大内存消耗约为 3.3 - 3.4 GB。之后,我在应用程序的任何地方都会遇到与内存/资源相关的崩溃。我花了一些时间来确定隐藏在某些 3rd 方库中的大型动态数组的使用情况。

我克服这个问题的方法是,我通过重新启动自身并使用某些参数关闭,使应用程序从它停止的地方恢复自身。如果内存消耗公平且当前操作完成,这一切都很好。

当当前内存使用量为 1GB 并且下一个要处理的操作需要 2.5 GB 或更多内存来处理时,就会出现大问题。我当前的代码在恢复之前将自身限制为 1.5 GB 已用内存的上限,但在这种情况下,我必须将限制降低到 1 GB 以下,这基本上会使应用程序在每次操作后自行恢复,甚至不能保证一切都会好起来的。

如果另一个操作需要处理更大的数据集并且总共需要 4GB 或更多内存怎么办?

需要注意的是,我不是在谈论实际的 4 GB 内存,而是通过分配巨大的动态数组来消耗内存,一旦取消分配,操作系统就不会返回,因此它仍然认为它已被消耗,所以它加起来。

因此,我的下一个攻击点是强制 fastmm 将所有(或至少部分)内存释放到操作系统。我专门针对这里的巨大动态数组。同样,这些都在第 3 方库中,因此重新编码并不是真正的首选。修改 fastmm 代码并编写 proc 来释放内存要容易和快捷得多。

我无法从 FastMM 切换,因为目前整个应用程序和一些第 3 方库都围绕 PushAllocationGroup 的使用进行了大量编码,以便快速查找和查明任何内存泄漏。我知道我可以编写一个虚拟的 FastMM 单元来解决编译引用问题,但是我将无法进行这种快速且确定的泄漏检测。

总之:有什么办法可以强制 FastMM 至少向操作系统释放一些大块?(嗯,当然有,实际的问题是:有没有人写过它,如果有,请分享一下?)

谢谢

稍后编辑:

我很快就会提出一个小的相关测试应用程序。模拟一个似乎并不容易

0 投票
1 回答
213 浏览

delphi - 分配给记录时的内存泄漏

在试图找出我们的一个新应用程序崩溃的原因时,我一直在追查 Delphi 中的内存泄漏。

我已经连接了最新版本的FastMM并一直在研究结果,但对以下内容感到困惑,为了简洁起见,我将其归结为基本内容。

我们有一个用 2 个字符串字段定义的记录。这些是从两个 TEdit 框分配的,同时我们将数据写入 TListView。这是关键代码:

问题似乎与 的值SourceTable/SourceColumn或 tp^. 价值观。

当我们相当时,TList 正在被正确清除: 如果我们注释掉分配给tp^.SourceTable/tp^.SourceField那么没有内存泄漏。

可能只是因为是过年,但是看不到SourceTable/SourceColumn是怎么放出来的……

0 投票
0 回答
166 浏览

delphi - 销毁帧时的抽象错误

在发现我们有一些基本的内存泄漏之后,我一直在对我们的一些应用程序进行一次大扫除。将 FastMM4 插入我们的一个应用程序后,我收到一个抽象错误,似乎是在我清除帧列表时

我有一个带有滚动框的表格。滚动框有结果列表或详细信息列表。结果和细节都设计在框架中。

首先,我得到一批结果(最多 25 条记录)并创建适当的帧数

当点击一个框架时,结果框架是清晰的,并且在滚动框上创建了一个详细框架。我目前已停用详细信息框架的创建,并专注于清除框架。

帧最初是这样清除的:

我也试过这样:

关于我做错了什么的任何建议 - 无论是关于创造还是毁灭?

0 投票
0 回答
203 浏览

delphi - 在 Delphi 中使用 Fastmm 时列表索引越界

我有一个应用程序,因为我需要使用 FastMM 清除内存泄漏。我在条件定义中添加了FullDebugMode、LogMemoryLeakDetailToFile 。在调试模式下关闭应用程序时,我得到了List index out of Bounds(0)并且应用程序正在终止,而没有在文件中写入任何内存泄漏。当时 Stack 也是空的。在错误报告中,也没有明确提及。我的应用程序可能有 n 个列表,这些列表以不同的方式以不同的形式创建。我正在使用 Delphi 6 和 FastMM4。TbitbtnClour、KbmMemtable、QuickReport 和 Indy 组件是我在这里使用的第三方组件。我完全糊涂了,请帮我解决这个问题。

0 投票
2 回答
778 浏览

delphi - FastMM 64 位“块头已损坏”

最新的 FastMM4 4.991,XE2,试图解决内存泄漏并在 FullDebugMode + LogErrorsToFile 设置下出现此错误。错误

代码非常简单,在多个项目中使用,没有任何错误

temp := temp + format('%.2X ', [b]);FastMM 在withformat或处引发“内存不足”异常IntToHex。调用堆栈导致 _USrCat、_UStrSetLength、_ReallocMem。总是在i = 27。参数为p1TBytes 数组的地址,长度为 128 字节,填充 41 字节( NativeUInt(@FData[0]) )。我试图将内存访问断点设置为 7FFFFE62540(地址来自 FastMM 消息“从指针地址 7FFFFE62540 开始的 256 字节的当前内存转储”),从应用程序开始跟踪这个内存块:它是空的未使用区域,直到内存块创建地址 7FFFFE62450 和地址 7FFFFE62540 由 FastMM 填充为 ptr + f0(当i = 27)。检查此块的控制和后,FastMM 失败(在 CPU 窗口中跟踪)。我也尝试排除此日志部分,但在简单时遇到了类似的异常inherited创建一个对象(远在此代码执行之后)。也只发生在FullDebugMode.

最后,我尝试使用相同的选项并FastMM4Options.inc在 32 位下构建和检查这个项目Target Platforms- 根本没有错误。一切安好。除了我无法在 Windows 7-64 下调试它。

那么 FastMM 中是否存在代码错误或已知错误?我花了 3 天时间跟踪它,但没有其他想法该怎么做(甚至尝试更换插槽中的前 4 GB 内存,4 x 2048)。使用来自 FastMM4 的 FastMM_FullDebugMode64.dll 和 FastMM_FullDebugMode.dll。谢谢。

编辑:解决这些事情很糟糕,但似乎我为自己找到了策略(已解决,这是缺点all in one,相同的对象作为不同的类取决于 OLE 或 Direct 模式,使用对象作为不同的类对象引起的错误)
1. 放FastMM4 在错误发生之前调用 LogAllocatedBlocksToFile(0, 0)
2. 在日志中查找最近的对象,对我来说,它是错误地址下方 300 字节附近的地址对象
3. 将数据断点放在错误地址附近的非零区域(对我来说它低于 40 美元字节)。几个断点,因为像 256 字节这样的大区域只是没有被更改触发。在这种情况下,它是最近对象的末尾(地址+日志大小)和错误地址之间的区域。
4. 分析断点上的代码。
5. 多次运行寻找要跟踪的内容,最后得到错误代码位置。在每次运行时重新启用数据断点,因为 IDE 会禁用它们。