【问题标题】:What is the "Cannot set allocations" error, who emits it and what can I do about it?什么是“无法设置分配”错误,是谁发出的,我该怎么办?
【发布时间】:2011-02-13 10:20:57
【问题描述】:

多年来,我们一直受到客户偶尔报告关于在我们的应用启动时出现“无法设置分配”的非描述性错误消息的困扰。到目前为止,我们从未能够在我们自己的测试环境中重现该问题。我现在已经没有尝试追查此事的想法了。以下是随时间积累的一系列观察结果:

  • 错误消息文本显示为“无法设置分配”(注意没有标点符号)。
  • 窗口标题只是读作“错误”(或本地化的等效项)。
  • 无论操作系统区域设置如何,“无法设置分配”文本始终为英文。
  • 到目前为止,我无法找到包含消息文本的 DLL 或 EXE。

  • Google 充斥着各种不同产品的reports of this error - 但没有解决方案。

  • 到目前为止,我能确定的受影响产品之间唯一统一的方面是,它们似乎都以加载到第三方进程(例如 Visual Studio 或 Windows Explorer shell 的插件)的 DLL 形式出现扩展名)。

  • 我们的应用实际上是一个用于 MS Outlook 的共享软件 COM 插件,用 Delphi 编写(即本机代码 - 没有 .NET)。

  • 在我们的案例中,主要嫌疑人是我们正在使用的第三方许可包装器,它可以即时解密和解压缩我们的 DLL 到内存中。显然,我不能简单地将我们应用程序的未受保护版本提供给受影响的客户来验证这种怀疑。也许被举报的其他供应商正在使用类似的产品。

  • 许可供应商提供给我们的保护包装的调试版本没有产生任何结果:日志文件看起来与未发生错误的会话完全相同。显然,“内部”DLL 已被解密和解压缩,但由于某种原因仍然无法被主机进程加载。

  • 通过创建一个未受保护的“加载器”DLL,我们能够查明在应该将我们的 DLL 加载到内存中的 LoadLibrary 调用后面某处发生的错误。

  • 我们自己的代码(不受保护的加载程序和受保护的“核心”-DLL)中的大量日志记录和全局异常挂钩根本没有产生任何结果。该错误显然是在其他地方提出的。

  • this earlier question of mine 中描述的问题很可能是由同一问题引起的。这是在我们创建不受保护的加载程序存根之前。

  • 该错误仅发生在大约 1-2% 的客户身上 - 而通常任何受影响客户站点的所有安装都会受到同样的影响。

  • 有时错误会在我们发布新版本后消失,但通常会在几周或几个月后再次出现。
  • 一旦机器上开始出现错误,它就会一直如此。
  • 当通过远程访问(例如 VNC、RDP、TeamViewer 等)连接到受影响的机器时,该错误永远不会发生,并且受影响的客户都不在我们的旅行距离内,所以我们所要做的就是日志文件和“目击者报告”。

  • 一位客户报告说错误消息对话框显然是非模态的,即他能够简单地将对话框移到一边并继续使用应用程序(减去我们的 DLL 将提供的功能) .不确定这是否在所有其他事件中也普遍适用。

  • 在某些情况下,客户可以通过禁用或卸载与我们自己的产品共享主机应用程序的其他供应商提供的其他插件来永久消除错误。

  • 到目前为止,该错误已在 Windows XP、Vista 和 7 上观察到。

  • 在过去的几周里,我们收到了大量来自 Outlook 2003 / Windows 7 用户的报告。最近的 Windows/Office 更新会使情况变得更糟吗?

有没有人遇到过这个错误?

或者还有什么其他的调查方法?

【问题讨论】:

    标签: windows debugging memory dll loadlibrary


    【解决方案1】:

    我最近才发生过这种情况,这促使我进行了搜索,最终我来到了这里。我可以告诉你,我肯定它在 Windows 7 家庭高级版中,但只有在 IE9 中(顺便说一句我讨厌),它使用户回到虚拟阶段,并假设我们必须重复标记所有内容。它会一直问您是否要禁用附加组件以加快加载时间,但通常是在那些并不是真正使浏览器变慢的事情上,首先是垃圾加载太多。但是回到“无法设置分配”,我从来没有在任何其他浏览器中使用过它,这并不是说它们不会发生这种情况。

    【讨论】:

      【解决方案2】:

      这纯属猜测,但听起来您的第三方许可软件可能正试图将您的 DLL 加载到内存中的特定位置,而在这些失败的系统上,该位置恰好已经被别的东西,也许是一个全局钩子 DLL。

      【讨论】:

      • 是的,这也是我所怀疑的......如果事实证明这是真的,那将是非常糟糕的,因为我们无法影响保护包装器的行为。但我想我还是会在保护设置上多玩一点……我已经知道这可能会使错误消失几周,但经验告诉我,这并不意味着什么:它会是几个月后可能会再次回来......:/
      • 即使它从未被官方确认,我现在要接受这个答案,因为在我们升级到更新版本的保护后,这个问题已经永久消失了(到目前为止>:])图书馆...
      【解决方案3】:

      如果您有一位愿意与您合作的客户,当错误消息出现时,它可能会帮助您了解获取故障转储的情况(例如,使用ADPlus 或者更简单的使用Sysinternals' ProcDump)正在显示。这将显示加载了哪些模块以及可能的调用堆栈(如果它来自错误发生时的消息框,而不是问题后捕获异常的消息框)。

      【讨论】:

      • 听起来是个好主意 - 但是,主机进程(即我们的例子中的 MS Outlook)不会(立即)由于错误而崩溃......它变得不稳定并且更有可能崩溃或稍后产生更多错误,否则它只会继续运行......只有在没有加载我们的插件的情况下...... ADPlus 是否仍允许我在显示错误消息时创建转储?
      • @Oliver Giesen:是的,那时应该可以获得故障转储。但它可能会要求用户在看到错误消息时运行某些东西。使用 Sysinternals ProcDump 执行此操作可能会更简单。我将用指向它的指针更新答案。
      【解决方案4】:

      我也遇到过“无法设置分配”问题。皇家的痛苦。我禁用了 Java,因为我似乎不需要它,所以我使用添加/删除程序从我的系统中删除 Java。然后我说要得到这些错误。我已重新安装,但在 IE 资源管理器中禁用了 Java。现在我不再收到错误了。不是程序员,不知道为什么会这样。也许有人的线索。 Win 7 - 64bit OS IE Explorer 10。希望这可以帮助某人解决这个问题。约翰

      【讨论】:

        【解决方案5】:

        我已经看到了这种情况。在我的例子中,一个全局钩子 dll 创建了一个大内存文件映射,可能是许可 dll 所依赖的内存。

        【讨论】:

          【解决方案6】:

          我仅在打开 google chrome 时看到“无法设置分配”。同样在此之后,chrome 关闭时会显示一条消息“哇 chrome 已崩溃......”

          还是没有解决办法:(

          【讨论】:

          【解决方案7】:

          我也不是程序员,但我打开 Chrome 时总是会发生这种情况。它打开第二个窗口并显示错误消息“无法设置分配”。我通常会关闭它并继续前进。如果我不这样做,它通常会导致崩溃。不会发生在任何其他浏览器上。

          【讨论】:

            猜你喜欢
            • 2021-04-27
            • 2021-08-06
            • 2021-11-09
            • 1970-01-01
            • 1970-01-01
            • 2022-11-24
            • 1970-01-01
            • 2022-07-25
            • 2012-03-11
            相关资源
            最近更新 更多