如何关闭容错堆?

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】:

将此注册表值设置为0HKEY_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

你可能需要重启你的机器

【讨论】:

以上是关于如何关闭容错堆?的主要内容,如果未能解决你的问题,请参考以下文章

华为模拟器ensp老是弹出一堆英文,如何关闭?

VirtualAlloc/VirtualFree 与堆函数 [关闭]

捕获系统堆转储数据关闭

什么是堆排序和优先队列? [关闭]

Java非常大的堆大小[关闭]

是否有任何工具可以检测 Visual C++ 6.0 上的缓冲区溢出? [关闭]