如何关闭容错堆?

46
我最近在启动我的应用程序时,在Visual Studio 2005输出窗口中看到了这行信息:
FTH: (7156): *** 应用于当前进程的容错堆(shim)。通常是由于之前出现了崩溃。***

我已经尝试按照这里的说明关闭容错堆:
http://msdn.microsoft.com/en-us/library/dd744764(VS.85).aspx

我正在运行Windows 7 64位版本,因此我已经对32位和64位注册表进行了更改,并且使用了32位和64位版本的Rundll32.exe运行了“Rundll32.exe fthsvc.dll,FthSysprepSpecialize”命令。

然而,重新启动后,当我尝试调试我的应用程序时,仍然会出现容错堆!

这是一个真正的问题,因为它掩盖了我要重现的错误,并且还会影响性能。

有没有其他建议如何禁用容错堆?

10个回答

49

要禁用单个应用程序的Fault-Tolerant Heap,

进入HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER版本的Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\your_application.exe,删除Fault-Tolerant-Heap条目。

来源于这里(实际上是这里


4
这个解决方案对我有用,但我只需要删除HKEY_LOCAL_MACHINE的FTH。 - Angie Quijano
这只是在启用后关闭它一次。它不能阻止其再次被启用,这才是真正所需的... - Glenn Maynard
1
@GlennMaynard 正如 @Aaron 指出的那样,在从 FTH 列表中删除应用程序后,通过将以下设置为零来禁止其添加新条目到其列表中:HKEY_LOCAL_MACHINE\Software\Microsoft\FTH\Enabled - Punitto Moe

8
将注册表值设置为0HKEY_LOCAL_MACHINE\Software\Microsoft\FTH\Enabled

我必须删除并重新编译我的exe文件才能使其正常工作。 - Donald Duck
@DonaldDuck 在我的电脑上(Windows 10),删除exe文件没有起作用,我不得不将其重命名。 - Paulo Carvalho

5
您可以将您的可执行文件名称添加到排除列表中。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FTH\ExclusionList

对我来说可以。


1
这个解决方案对我没用。你是添加了可执行文件的整个路径还是只有可执行文件的名称? - Angie Quijano
@AngieQuijano 起初它也不起作用,但当我删除并重新编译我的exe文件时,它就可以工作了(仅重新编译是不行的,必须先删除)。 - Donald Duck
1
@DonaldDuck,在我的电脑上(Windows 10),删除exe文件没有起作用。我不得不将其重命名。 - Paulo Carvalho

2
您可以通过以下步骤清除FTH跟踪的应用程序列表而无需停止此服务:
  1. 点击开始菜单。
  2. 右键单击计算机并单击管理。
  3. 单击事件查看器 -> 应用程序和服务日志 -> Microsoft -> Windows -> 容错堆。
  4. 查看FTH事件。

您将找到名为“操作”的文件,右键单击并选择清除日志, 然后您可以再次运行程序,警告消息将消失, 我自己尝试过了,而且不需要重新启动操作系统。


2

非常感谢您的回答。不幸的是,按照您建议的修改应用程序清单并重置PCA并没有任何改变。 - MJW

2
在Windows 10上,注册表位置是:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FTH

您可以在以下位置从列表中删除可执行文件:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FTH\State

或者您可以从提升的命令提示符中运行此命令。
Rundll32.exe fthsvc.dll,FthSysprepSpecialize

您可能需要重新启动计算机


1
"

“Rundll32.exe fthsvc.dll, FthSysprepSpecialize”只会清除当前标记应用程序列表。如果您的应用程序仍然导致异常,FTH仍然应该介入并接管。

如前所述:

将此注册表值设置为0:HKEY_LOCAL_MACHINE\Software\Microsoft\FTH\Enabled

这应该禁用整个系统的FTH。

"

0

我不得不重命名文件,因为与此键相关的注册表项为空,没有适用的数据。如果您有一个行为不良的应用程序,我希望它们会填充。但在我的情况下,我正在Visual Studio中调试自己的应用程序。因此,在这种情况下,是我的进程以某种方式加载了FTH,无论FTH服务是否正在运行。事实上,我没有列出任何先前标记为行为不良的应用程序。

但我必须按照这些说明:

http://billroper.livejournal.com/960825.html

因为它不允许我重命名文件,直到我拥有所有权并确保我拥有完全控制权。


0

当我使用(Microsoft :: VisualStudio :: CppUnitTestFramework)运行单元测试时,遇到了类似的问题。 不知何故,我违反了一些堆分配规则,下次尝试进行调试时,我收到了以下消息:“当前进程应用了容错堆垫片。这通常是由于先前的崩溃引起的。”然后调试环境就卡住了。

为了让它重新工作,我必须删除测试用例,重新编译并再次添加,然后重新编译,这样我才能设置断点并进入测试。


-1

我也遇到了这个问题。在Windows\AppPatch文件夹中重命名/删除AcXtrnal.dll似乎对我有用。我喜欢这个微软推荐的操作(我首先尝试了它)却毫无作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接