如何关闭容错堆?
Posted
技术标签:
【中文标题】如何关闭容错堆?【英文标题】:How do I turn off the fault tolerant heap? 【发布时间】:2011-06-28 13:42:20 【问题描述】:我最近在启动我的应用程序时开始在 Visual Studio 2005 输出窗口中看到这一行:FTH: (7156): *** 容错堆 shim 应用于当前进程。这通常是由于以前的崩溃造成的。 ***
我已尝试使用此处的说明关闭容错堆:http://msdn.microsoft.com/en-us/library/dd744764(VS.85).aspx
我正在运行 Windows 7 64 位版本,因此我对 32 位和 64 位注册表进行了更改,并使用 32 运行“Rundll32.exe fthsvc.dll,FthSysprepSpecialize”命令-bit 和 64 位版本的 Rundll32.exe。
但是,重新启动后,在尝试调试我的应用程序时,我仍然得到容错堆!
这是一个真正的问题,因为它掩盖了我试图重现的错误,而且还会降低性能。
是否有人对如何禁用容错堆有任何其他建议?
【问题讨论】:
【参考方案1】:您可以将application manifest 编辑为excluding your program from PCA
另见:How to reset Program Compatibility Assistant for testing
【讨论】:
非常感谢您的回答。不幸的是,按照您的建议修改应用程序清单并重置 PCA 没有任何区别。【参考方案2】:将此注册表值设置为0
:
HKEY_LOCAL_MACHINE\Software\Microsoft\FTH\Enabled
【讨论】:
我必须删除并重新编译我的 exe 文件才能正常工作。 @DonaldDuck 删除 exe 对我不起作用(Windows 10)。我不得不重命名它。【参考方案3】:也遇到了这个。在 Windows\AppPatch 中重命名/删除 AcXtrnal.dll 似乎对我有用。我喜欢这个微软推荐的操作(我首先做了)什么都不做。
【讨论】:
【参考方案4】:“Rundll32.exe fthsvc.dll,FthSysprepSpecialize”看起来只清除当前标记的应用程序列表。如果您的应用程序仍然导致异常,FTH 仍应介入并接管。
如前所述:
将此注册表值设置为 0:HKEY_LOCAL_MACHINE\Software\Microsoft\FTH\Enabled
这应该禁用整个系统的 FTH。
【讨论】:
【参考方案5】:为单个应用程序禁用它
转到 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 版本 软件\微软\Windows NT\CurrentVersion\AppCompatFlags\Layers\your_application.exe 和 删除 FaultTolerantHeap 条目。
来自here(实际上是here)
【讨论】:
这个解决方案对我有用,但我只需要删除 HKEY_LOCAL_MACHINE 的 FTH。 这只会在启用后将其关闭。它不会阻止它再次启用,这是真正需要的......【参考方案6】:您可以将可执行文件的名称添加到 ExclusionList。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FTH\ExclusionList
为我工作。
【讨论】:
这个解决方案对我不起作用。您是否添加了可执行文件的整个路径?还是只是可执行文件名? @AngieQuijano 一开始它对我也不起作用,但是当我删除并重新编译我的 exe 文件时它起作用了(重新编译它不起作用,我不得不删除它) . @DonaldDuck 删除 exe 对我不起作用(Windows 10)。我不得不重命名它。【参考方案7】:我也不得不重命名该文件,因为与此键关联的注册表项中没有适用的数据。如果您有一个行为不端的应用程序,我希望它们会填充。但就我而言,我是在 Visual Studio 中调试自己的应用程序。所以在那种情况下,无论 FTH 服务是否正在运行,都是我的进程以某种方式加载了 FTH。事实上,我没有列出之前被标记为行为不端的应用程序。
但我必须遵循以下说明:
http://billroper.livejournal.com/960825.html
因为在我获得所有权并确保我拥有完全控制权之前,它不会让我重命名文件。
【讨论】:
【参考方案8】:我在使用 (Microsoft::VisualStudio::CppUnitTestFramework) 运行单元测试时遇到了类似的问题。 不知何故,我违反了一些堆分配,下次我尝试调试时收到消息:“容错堆 shim 应用于当前进程。这通常是由于以前的崩溃造成的。”然后调试环境冻结了。
为了让它再次工作,我必须删除测试用例,重新编译并再次添加它并重新编译,然后我可以设置断点并进入测试。
【讨论】:
【参考方案9】:您可以按照以下步骤在不停止此服务的情况下清除 FTH 跟踪的应用程序列表:
-
点击开始菜单。
右键单击计算机,然后单击管理。
单击事件查看器 -> 应用程序和服务日志 -> Microsoft ->
Windows -> 容错堆。
查看 FTH 事件。
你会发现文件名为操作右键单击并选择清除日志, 然后你可以再次运行你的程序,警告信息会消失, 它与我一起工作而无需重新启动操作系统。
【讨论】:
【参考方案10】:在 Windows 10 上,注册表位置是:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FTH
您可以从以下列表中删除您的可执行文件:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FTH\State
或者您可以从提升的命令提示符运行此命令
Rundll32.exe fthsvc.dll,FthSysprepSpecialize
你可能需要重启你的机器
【讨论】:
以上是关于如何关闭容错堆?的主要内容,如果未能解决你的问题,请参考以下文章