问题标签 [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.
c++ - 如何将 FastMM 添加到 C++ Builder 项目?
我正在尝试配置FASTMM4
,Builder C++ 6
我遵循的步骤是;
- 从sourceforge下载 zip 。
- 在
Project -> Options -> Linker
我未选中的菜单下"Use Dynamic RTL"
。 - 将内容解压缩
C:/tools/FASTMM
并将FASTMM4.pas
文件添加到我的测试 C++ VCL 项目中。 - 只需从 Project 菜单编译单元并
FastMM4.hpp
在 FastMM 文件夹中获得一个新文件。 - 包含
FastMM4BCB.cpp
在我的项目中的文件,也写#include <FASTMM4.hpp>
在顶部。 - 添加路径
FastMM_FullDebugMode.dll
并FastMM_FullDebugMode.lib
移至安装目录FastMM_FullDebugMode.dll
中的Bin
文件夹。Builder C++
{$define FullDebugMode}
从启用线路FastMM4Options.inc
。
我错过了什么吗?为什么我会出现以下错误?
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
delphi - 释放动态数组后阻止页脚损坏
当用户登录服务器并且服务器发送与用户名/密码匹配结果相关的响应时,我遇到了这个错误。具有回复数据包的数组导致错误。我不知道如何解决这个问题,这是我第一次看到这样的错误。
代码
主要方法
fOnLogin 方法
FastMM 日志
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 服务器),这让我很疑惑。
delphi - 符号中出现额外的“$qqrv”
德尔福 XE3。我正在使用 JCL 错误对话框和 FastMM,在我的应用程序中打开了 FullDebug,并将“垃圾”附加到堆栈跟踪中的符号(JCL 和 FastMM):
当我想要的是:
但仅当应用程序为 Release 编译时。当我为调试编译时,堆栈跟踪是“干净的”。由于我在 FastMM 和 JCL 报告中看到了相同类型的“垃圾”,我认为这两个库都不会造成麻烦。
我说的是带引号的“垃圾”,因为 $qqv 似乎是恒定的,并且字符串的其余部分因运行而异。
我已检查(并重新检查)地图文件和符号设置以及 JCL 符号,但在设置中看不到任何不同。
编辑:毫不奇怪,根本原因是相同的,因为 FastMM 是(我认为)使用 JCLDebug 生成堆栈跟踪......所以修复一个,修复所有。
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 至少向操作系统释放一些大块?(嗯,当然有,实际的问题是:有没有人写过它,如果有,请分享一下?)
谢谢
稍后编辑:
我很快就会提出一个小的相关测试应用程序。模拟一个似乎并不容易
delphi - 分配给记录时的内存泄漏
在试图找出我们的一个新应用程序崩溃的原因时,我一直在追查 Delphi 中的内存泄漏。
我已经连接了最新版本的FastMM并一直在研究结果,但对以下内容感到困惑,为了简洁起见,我将其归结为基本内容。
我们有一个用 2 个字符串字段定义的记录。这些是从两个 TEdit 框分配的,同时我们将数据写入 TListView。这是关键代码:
问题似乎与 的值SourceTable/SourceColumn
或 tp^. 价值观。
当我们相当时,TList 正在被正确清除: 如果我们注释掉分配给tp^.SourceTable/tp^.SourceField
那么没有内存泄漏。
可能只是因为是过年,但是看不到SourceTable/SourceColumn是怎么放出来的……
delphi - 销毁帧时的抽象错误
在发现我们有一些基本的内存泄漏之后,我一直在对我们的一些应用程序进行一次大扫除。将 FastMM4 插入我们的一个应用程序后,我收到一个抽象错误,似乎是在我清除帧列表时
我有一个带有滚动框的表格。滚动框有结果列表或详细信息列表。结果和细节都设计在框架中。
首先,我得到一批结果(最多 25 条记录)并创建适当的帧数
当点击一个框架时,结果框架是清晰的,并且在滚动框上创建了一个详细框架。我目前已停用详细信息框架的创建,并专注于清除框架。
帧最初是这样清除的:
我也试过这样:
关于我做错了什么的任何建议 - 无论是关于创造还是毁灭?
delphi - 在 Delphi 中使用 Fastmm 时列表索引越界
我有一个应用程序,因为我需要使用 FastMM 清除内存泄漏。我在条件定义中添加了FullDebugMode、LogMemoryLeakDetailToFile 。在调试模式下关闭应用程序时,我得到了List index out of Bounds(0)并且应用程序正在终止,而没有在文件中写入任何内存泄漏。当时 Stack 也是空的。在错误报告中,也没有明确提及。我的应用程序可能有 n 个列表,这些列表以不同的方式以不同的形式创建。我正在使用 Delphi 6 和 FastMM4。TbitbtnClour、KbmMemtable、QuickReport 和 Indy 组件是我在这里使用的第三方组件。我完全糊涂了,请帮我解决这个问题。
delphi - FastMM 64 位“块头已损坏”
最新的 FastMM4 4.991,XE2,试图解决内存泄漏并在 FullDebugMode + LogErrorsToFile 设置下出现此错误。错误
代码非常简单,在多个项目中使用,没有任何错误
temp := temp + format('%.2X ', [b]);
FastMM 在withformat
或处引发“内存不足”异常IntToHex
。调用堆栈导致 _USrCat、_UStrSetLength、_ReallocMem。总是在i = 27
。参数为p1
TBytes 数组的地址,长度为 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 会禁用它们。