如何修复“LME288/未知堆名称”警告?

Posted

技术标签:

【中文标题】如何修复“LME288/未知堆名称”警告?【英文标题】:How to fix "LME288/Unknown heap name" warning? 【发布时间】:2015-05-09 20:55:39 【问题描述】:

突然,我收到 LME288 链接器错误。

[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ilc: 0x00010000 / 0x08000000
[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ild: 0x00010000 / 0x08000000
[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ilf: 0x00010000 / 0x0a000000
[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ils: 0x0003b000 / 0x08000000
[ilink32 Warning] Warning: unknown heap name   : 0x08000000 / 0x08000000
[ilink32 Warning] Warning: Error detected (LME288)
[ilink32 Error] Error: Unable to perform link

我没有安装 AV,并且该项目已经运行了一年多。我试过了:

禁用/启用增量链接器,没有区别... 手动删除 /debug 中的所有文件,仍然没有变化... 完整版本,没有区别... 重新启动计算机,没有任何变化...

这在here 之前已经问过,但没有给出真正的解释或解决方案。

我还能做些什么来解决这个问题?

编辑 我尝试重建其他几个多年来一直运行良好的项目,现在我的所有项目都出现 LME288 错误。

【问题讨论】:

多年来,这已多次向 QualityCentral 报告:#102099、#106085 和 #109265 所有三个报告都已关闭,没有任何解决方案或解决方法。我怀疑这个问题与项目有关。一个人甚至重新安装了 Builder,但问题仍然存在。一定是某些缓存文件损坏了。我正在清理我所有的临时文件夹,看看是否有帮助。 我清理了磁盘上的所有临时文件,清空了垃圾箱,现在它又可以工作了。 QC 通常会关闭有效问题,因为“无法重现”...意味着许多暂时性问题未得到解决。我在尝试使用 64 位调试器时遇到了这样的问题。 生成器中的这个错误让我沸腾了。我与 Embarcadero 支持人员进行了一次巨大的交流,试图深入了解它。我所有的问题都是从 Windows 10 上的 XE7 开始的,在此过程中,有几件事情在短时间内为我解决了这个问题。安装 XE8,修复 XE7。通过删除非版本控制文件来清理我的项目。然而,给我最大的修复的一件事(直到今天还好几个月)是在我的 PC 上创建一个新的用户帐户。现在我坐在这里,浪费时间,因为这个错误,我永远不会选择再次使用 Builder。 【参考方案1】:

2020 年 1 月 15 日,Embarcadero 将 RSP-12869 的状态从“需要反馈”更改为“开放”,并将其分配给内部开发人员。

较早的历史: 随着 2017 年 4 月 C++ Builder 10.2 Tokyo 版本的发布,Embarcadero 升级了链接器,声称解决了这个问题:“链接器现在可以识别大地址,在 64 位系统上可以寻址高达 4GB,是之前数量的两倍。(过去,一些客户通过切换 PE 标头中的位将链接器破解为 LAE [原文如此];由于编写的代码不是 LAE 感知的,因此这种破解阻止了增量链接,有时其他功能无法正常运行。)” https://community.embarcadero.com/blogs/entry/what-s-new-in-c-builder-10-2-part-1-the-linker

但是,2017 年 5 月 24 日,Ashleigh Quick 报告说 10.2 Tokyo 的链接器仍然无法解决问题: RSP-12869。同样,@Ultralisk 在 2020-01-09 下面的评论中报告了同样的问题。

这里有一个解决方法:从 10.2 Tokyo 开始,您可以使用一些新选项来控制 LARGEADDRESSAWARE 和链接器堆大小。 Dieter Woellner reported on 26-Oct-2017 暂时设置 C++-Linker |高级 | “-GF:LARGEADDRESSAWARE”的高级选项条目消除了这个问题。但是问题又回来了,他发现如果您将 TDS Heapsize 设置为低于 0x08000000 的值,您可以避免链接时出现错误/崩溃...暂时。

======================================

我是那些将链接器破解为 LAA 的客户之一,从而干扰了增量链接(我不需要)并解决了我的问题。如果您不需要增量链接,请继续阅读。

======================================

我通过在ilink32.exe 中设置/LARGEADDRESSAWARE 标志解决了这个问题。最初的解决方案来自 Hiroyuki Shimada,使用 editbin,并于 2016 年 1 月 12 日发布于 http://qc.embarcadero.com/wc/qcmain.aspx?d=134775。他还申请了bcc32.exe;我不需要。

作为一项公共服务,我在此处发布了我的修补 ilink32.exe 版本:

RAD 工作室 10 西雅图: https://s3.amazonaws.com/public-mfay/ilink32.exe RAD Studio 10.1 柏林:https://s3.amazonaws.com/public-mfay/ilink32-10.1.exe

要使用其中任何一个,请在 RAD Studio 二进制文件目录中重命名您的 ilink32.exe(例如,C:\Program Files (x86)\Embarcadero\Studio\17.0\bin 用于 RAD Studio 西雅图,或 ...\18.0\bin 用于柏林),然后复制我的位置,将其重命名为 ilink32.exe

[注意:这些 /LAA 链接器解决了许多但不是所有用户的问题;请参阅@Andrew Legget 于 2016 年 7 月 25 日在https://quality.embarcadero.com/browse/RSP-13247 发布的帖子]

这个问题已经存在了很长时间,并且不仅限于 XE3、XE5、XE7、XE8... 现在在https://quality.embarcadero.com/browse/RSP-13247 上进行了长时间的讨论/感叹,为什么在一个版本的 RAD 中修复了这个问题Studio 但在更高版本中退出;显然 /LAA “在与静态 RTL 增量链接时导致失败”。根据 Dennis Jones 在该线程中 28/Mar/16 下午 12:14 的帖子,/LAA 补丁没有解决其他链接器错误“EXE1825”或“内存不足”。

如果您想了解可以修补 ilink32.exe 的三种方式,请阅读下文...


    使用 lamarker 工具设置大地址感知标志,可从以下位置下载:http://cc.embarcadero.com/Item/30459(感谢 Doug Hay,2016 年 7 月 19 日在https://quality.embarcadero.com/browse/RSP-13247 发帖):

    lamarker -M -Filink32.exe

(您可以直接在您的C:\Program Files (x86)\Embarcadero\Studio\17.0\bin(或...\18.0\bin)目录中执行此操作;它将原来的ilink32.exe 重命名为ilink32.exe.old——如果您有权限)

--或--

    使用 MS Visual Studio 中的editbin,如果您已经安装了此类(Microsoft 声称必须在 IDE 中运行editbin)。作为初步步骤,复制 bcc32.exeilink32.exe 以防止 UAC 阻塞(并备份它们)

    copy "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\bcc32.exe" .

    copy "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\ilink32.exe" .

    editbin /LARGEADDRESSAWARE bcc32.exe

    editbin /LARGEADDRESSAWARE ilink32.exe

-- 或者--

    使用 ma​​sm32 包中的 editbin 设置大地址感知标志:

从http://www.masm32.com/download.htm 下载,创建c:\masm32\bin\editbin.exe。我在安装 MASM32 期间收到了一些警告(涉及序号 201 和 203),但它的自检通过了,我只需要 editbin.exe

【讨论】:

在您的情况下,您是否真的遇到过大文件问题?其他一些拥有 LME288 的人只有小项目,错误似乎是由损坏或权限错误的临时文件引起的;所以也许相同的错误代码用于两个完全不同的问题。 40 个模块中的 50,000 行代码,因此,中等规模。该问题可能发生在没有临时文件的原始构建目录中。 我只想告诉你,你的公共服务并没有被忽视——你把我们从这场噩梦中拯救了出来,谢谢! 确认 lamarker.exe 修复适用于 ilink32.exe 的 XE3 版本。诚然,原件被如此锁定(不断收到拒绝访问错误),以至于我不得不弄乱 ilink32 的安全设置,将其复制到我的桌面文件夹,转换并复制回程序目录。但工具运行成功后,链接不再出错。 “随着 2017 年东京奥运会 Embarcadero 升级了链接器” - 不。他们什么都没修。我仍然在一个少于 700 行代码的项目中看到错误!【参考方案2】:

在 Windows 10 上安装 RAD Studio XE8 时,我也遇到了这个问题。在 Windows 7 (x86) 上安装时,RAD Studio XE8 工作正常。

升级到 Windows 10 (x86) 后,我遇到了可怕的未知堆 LME288 错误。起初它没有出现在 Windows 10 上,但如果我安装了一些东西,它就会弹出。如果我将计算机恢复到 Windows 7,它就会消失。

在网上稍微研究了一下,找到了解决办法。 ilink32.exe 存在内存问题,您需要在计算机启动时启用 3GB 内存空间。如果再次显示此错误,我现在将执行以下操作:

    以管理员身份运行命令提示符。 键入(不带引号)“bcdedit /set increaseUserVa 3072” 重启电脑。

这样做后,ilink32 就可以正常工作了。

我发现安装较新版本的 Acronis True Image (2016) 后,LME288 错误又回来了。但是在这里运行 bcdedit 解决方案,它修复了 RAD Studio XE8 链接器!!!

【讨论】:

ilink32.exe 未使用 /LARGEADDRESSAWARE 标志编译。所以我不明白这个解决方案是如何工作的。 也为我工作!【参考方案3】:

我找到了一个似乎可行的解决方法。

这似乎与损坏的临时文件有关。在我对系统磁盘进行“磁盘清理”后,我设法让它再次工作。

我删除了列表中的所有文件(选中了所有复选框)以及“清理系统文件”

之后我可以编译和链接,即使没有重新启动。 甚至增量链接又开始起作用了!

【讨论】:

感谢分享!这也适用于 C++ Builder XE6。对于遇到此问题的任何其他人,“磁盘清理”是 Windows 工具 (cleanmgr.exe),而不是 C++ Builder 的功能。 我想知道它是否可能与管理员拥有的临时文件有关,并且您以用户身份运行C++B,因此它无法写入所需的临时文件 我以前试过这个,它似乎工作,但今天我花了 3 个小时尝试我能想到的一切,但没有运气。我数不清我运行 Disk Clenaup、重新启动、手动清理所有临时文件、以管理员身份运行等等的次数。似乎有什么诀窍是改变虚拟内存的数量。我把它设置为“由操作系统管理的大小”,但我手动将它设置得更大一些,现在它可以工作了......让我们看看多长时间:( @Migrate2Lazarus 这整个错误都是巫毒教,人们出于绝望尝试了很多事情。这适用于某些人,而不适用于其他人。临时目录并不是唯一可能存在临时文件的地方,而且没有法律规定它们会被覆盖,这取决于每个应用程序。 @MaxKielland - 不。这不是关于 C++ Builder 或 Delphi,而是关于我们在 Embarcadero 商业产品中遇到的日常错误,我们习惯于对它们闭嘴的错误。多年来未修复的错误,即使它们每小时都会使 IDE/编译器崩溃。【参考方案4】:

只是以管理员身份运行 XE8 为我修复了它。

【讨论】:

【参考方案5】:

作为Drewski,我在升级到Windows 10 (x64) 后遇到了LME288 错误。

更改ilink32.exe数据执行保护设置,错误消失了:

系统属性->高级系统设置->性能->设置->数据执行保护 为除我选择的程序和服务之外的所有程序和服务启用 DEP -> ilink32.exe

【讨论】:

这解决了我的问题。 tks 这解决了我在 Windows 7 Pro 和 C++ Builder XE4 上的问题。我还为 DEP 添加了 bcc32.exe(ilinke32.exe 有时只是不起作用)。我很感激。【参考方案6】:

就我而言,尝试此处提到的所有其他选项根本不起作用。

诀窍似乎是在我的 Windows 10 机器的系统设置中手动设置虚拟内存量。它被设置为由操作系统自动管理,但将其更改为手动值(即使最小值小于自动分配的值,并且它是实际使用的值)会使链接器再次工作。

在我的情况下,操作系统分配了大约 1,600 Mb。我将最小值设置为 1,024,最大值设置为 3,072,重新启动,现在链接器工作正常。使用的数量是 1,024(即使推荐值是 ~1,900)。

【讨论】:

【参考方案7】:

我有一个不同的解决方案,希望能帮助解决这个问题的人。

我尝试了所有方法,但之前建议的解决方案都不适合我。磁盘清理没有帮助。这显然是 C++Builder 中存在多年的 bug,即使在 2015 年的 XE8 中也仍未修复。

幸运的是,我有另一台具有工作环境的计算机,在其中编译了相同的项目。我将所有文件(*.exe、*.obj 等)从该计算机的输出目录(Win32/Debug)复制到我遇到问题的那个,这神奇地设置了 C++ Builder;之后的所有构建都开始工作。

【讨论】:

【参考方案8】:

已针对 XE10 和 Windows 10 (x64) 与 Bitdefender IS 2016 修复:

Bitdefender -> 模块 -> 防病毒 -> 排除 -> 排除的进程 -> 添加“...\bin\ilink32.exe” -> 允许

【讨论】:

【参考方案9】:

重启 W10 解决了 XE5 上的这个问题 但我正在停用增量构建

【讨论】:

【参考方案10】:

我通过确保从所有防病毒扫描中排除 Embarcadero 安装文件夹(例如 C:\Program Files (x86)\Embarcadero)来解决此问题。

【讨论】:

【参考方案11】:

Windows 10(x64),Rad Studio XE Berlin(启用增量链接)。

我通过排除解决了问题 来自防病毒 Window Defender 扫描的“C:\Program Files (x86)\Embarcadero\bin”。

【讨论】:

【参考方案12】:

使用 BDSSetLang.exe 将 IDE 语言从法语更改为英语 为我解决了 LME288 错误!

【讨论】:

【参考方案13】:

解决方法很简单:windows PATH 环境变量超过了 2047 字节的限制。

请在此处查看我的描述: http://blog.bitart.at/lme288/ [德语]

编辑:我的“解决方案”只持续了几个月。安装 Microsoft Visual Studio 后问题又回来了。

正如另一个答案中提到的:用

修补 ilink32.exe

lamarker -M -Filink32.exe

似乎是正确的解决方案。

【讨论】:

【参考方案14】:

似乎使用 10.2.3 提供的链接器,TDS 堆大小可以设置为0x1FF00000。在较旧和较新的版本中,此最大值较小(提供 LME200)。如果您需要较大的堆大小,我建议使用 10.2.3 中的链接器。我还打开了一个关于此的错误报告:RSP-27205

【讨论】:

【参考方案15】:

对我来说似乎是绝对随机的......我也遇到了“未知堆名称”故障。我尝试了很多上面的解决方案,但都没有奏效。我尝试了circlepi314的ilink,尝试清理临时文件,多次重启等。 在 Embarcadero 的链接器故障页面上,我发现来自 dll 的调用约定可能会导致问题。我的项目确实包含对 dll 的调用。 我排除了这些调用,编译并再次链接,没有任何问题。 在那之后,我再次包含了这些调用,并且它也没有任何问题地链接了。尽管我什至在两者之间清理了项目。我什至不能再复制它了。 一定有一些残基被链接器使用并且现在已经消失了。 所以希望这可能会在将来对某人有所帮助。

【讨论】:

【参考方案16】:

在我的情况下,它是 Avast Antivirus - 我将其关闭并且链接正常

【讨论】:

【参考方案17】:

我在 10.4 中遇到了同样的问题。 ilink32 在安装后的第一次编译时发出一长串警告。我检查了链接器选项中的大地址感知 (LARGEADDRESSAWARE) 标志,它已经设置好了。然后我将 TDS Heapsize 设置为低于 0x08000000 的值(我使用了 0x07FFFFFF)并进行了重建。至此,链接彻底失效。然后我将 TDS Heapsize 重置为默认值 0 并重新构建,此时所有 ilink32 警告都被消除并且链接完全干净。

我怀疑除非明确设置,否则不会从配置中读取 TDS Heapsize 值。我怀疑在默认零上键入零会起作用,因为 IDE 可能看不到值的变化,所以我建议设置为除零以外的某个值,构建,然后设置回零并重新构建。

【讨论】:

以上是关于如何修复“LME288/未知堆名称”警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 brew doctor 警告

如何修复代码分析警告[重复]

如何修复“UIPopoverController 已弃用”警告?

如何修复警告:初始化程序周围缺少大括号?

Roslyn:如何修复 RS2008 警告?

如何修复“警告:useLayoutEffect 在服务器上啥都不做”?