代码之家  ›  专栏  ›  技术社区  ›  Oliver Giesen

什么是“cannot set allocations”错误,是谁发出的?我该怎么办?

  •  3
  • Oliver Giesen  · 技术社区  · 16 年前

    几年来,我们一直受到来自客户的偶然报告的困扰,这些报告涉及一条在我们的应用程序启动时出现的“无法设置分配”的非描述性错误消息。到目前为止,我们还无法在自己的测试环境中重现这个问题。我现在已经没有办法去追查这个了。以下是一组随时间积累的观察结果:

    • 错误消息文本显示“无法设置分配”(注意没有标点符号)。
    • 窗口标题只显示“错误”(或本地化的等效项)。
    • “cannot set allocations”(无法设置分配)文本始终为英文,而不考虑操作系统区域设置。
    • 到目前为止,我还无法找到包含消息文本的dll或exe。

    • 谷歌充满了 reports of this error 对于各种不同的产品-但没有解决方案。

    • 到目前为止,我能了解到的受影响产品之间唯一统一的方面是它们似乎都是以加载到第三方进程中的DLL的形式出现的(例如,用于Visual Studio的加载项或Windows资源管理器外壳扩展)。

    • 我们的应用程序实际上是一个用于MS Outlook的共享软件加载项,用Delphi(即本机代码-no.net)编写。

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

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

    • 通过创建一个不受保护的“加载器”DLL,我们能够在 LoadLibrary 这个调用应该将DLL加载到内存中。

    • 在我们自己的代码(不受保护的加载程序和受保护的“core”-dll)中,大量的日志记录和全局异常挂钩根本没有产生任何结果。这个错误显然是在别的地方引起的。

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

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

    • 有时在我们发布新版本后,错误会消失,但通常在几周或几个月后,错误会再次出现。
    • 一旦错误开始在机器上发生,它就会一直这样做。
    • 通过远程访问(如VNC、RDP、TeamViewer等)连接到受影响的机器时,不会发生错误,而且受影响的客户都不在我们的行程范围内,因此我们只需查看日志文件和“目击报告”。

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

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

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

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

    有人对这个错误有经验吗?

    或者还有什么关于调查的想法?

    7 回复  |  直到 9 年前
        1
  •  1
  •   500 - Internal Server Error    16 年前

    这将是纯粹的猜测工作,但听起来好像您的第三方许可软件正在试图在内存中的特定位置加载您的DLL,而在这些失败的系统上,恰好已经被其他东西占用,可能是一个全局挂钩DLL。

        2
  •  2
  •   tim    13 年前

    我最近才遇到这种情况,这促使我进行了搜索,结果我来到了这里。我可以告诉你,我确定它在Windows 7 Home Premium中,但只有IE9(顺便说一句,我讨厌它)才能将用户减少到虚拟阶段,并假定我们必须重复标记所有内容。它会不断问你是否要禁用加载项以加快加载时间,但通常是在那些不是很瘦的东西上一开始是浏览器慢了,首先是垃圾加载太多了,但是回到“不能设置分配”,我一个人从来没有在其他浏览器中过期过,也没有说它不会发生在他们身上。

        3
  •  1
  •   Mark Wilkins    16 年前

    如果你有一个客户愿意与你合作一点,它可能会为你的情况提供一些线索,以获得一个崩溃转储(例如 ADPlus 或者更简单一些 Sysinternals' ProcDump )当显示错误信息时。这将显示加载了哪些模块,可能还有调用堆栈(如果在错误发生时来自消息框,而不是在问题发生后捕获异常的消息框)。

        4
  •  0
  •   John    13 年前

    我还遇到了“无法设置分配”问题。皇家疼痛。我已经禁用Java,因为我似乎不需要它,我使用添加/删除程序来从我的系统中删除Java。然后我声明要得到这些错误。我重新安装了,但在IE浏览器中禁用了Java。现在我不知道错误了。不是程序员,不知道为什么会这样。也许是给某人的线索。 赢得7-64位操作系统IE Explorer 10。希望这能帮助别人解决这个问题。约翰

        5
  •  0
  •   vt.    12 年前

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

        6
  •  0
  •   Yogurtu    11 年前

    我只在打开Google Chrome时看到“无法设置分配”。在那之后,Chrome关闭了一个消息,说“WhoaChrome崩溃了…”

    仍然没有解决方案:(

        7
  •  0
  •   mark b    10 年前

    也不是程序员,但它总是在我打开chrome时发生。它打开第二个窗口,并显示错误消息“无法设置分配”。我通常把它关上然后继续我的路。如果我不这样做,通常会导致撞车。在任何其他浏览器上都不会发生。