【问题标题】:Getting ReportAvOnComRelease Exception when using 3rd party COM使用 3rd 方 COM 时出现 ReportAvOnComRelease 异常
【发布时间】:2011-02-22 03:21:25
【问题描述】:

我是一名新的 C# 程序员,并创建了一个应用程序,该应用程序使用第 3 方 COM 对象来跟踪来自通话记录服务器的电话通话记录。 COM软件的创建者也是制作通话录音软件的供应商,所以你会认为它应该可以工作。我与他们的员工进行了许多电话和代码审查,但他们提供的帮助很少。

应用程序响应来自 COM 对象的事件,如 OnCallStart 和 OnCallEnd、AgentLogon、AgentLogoff、ServerDown 等。我只是监视事件返回的内容并将其写入文件。该应用程序编译没有问题并运行了几分钟,然后它给了我以下错误(我必须在 Debug>Exceptions 菜单中打开 Exception 才能最终看到它):

检测到 ReportAvOnComRelease
消息:在通过 Marshal.Release 或 Marshal.ReleaseComObject 或在相应的 RuntimeCallableWrapper 被垃圾回收后隐式释放 COM 接口指针时捕获但处理了异常。这是用户引用计数错误或 COM 对象的 Release 存在其他问题的结果。确保正确管理引用计数。 COM 接口指针的原始 vtable 指针是 0x45ecbac。虽然 CLR 会捕获这些类型的异常,但它们仍可能导致损坏和数据丢失,因此应尽可能解决导致异常的问题。

它给我的仅此而已。没有 vtable 详细信息、引用计数或其他任何内容。我编写了一个 GC.Collect() 并让应用程序运行了一分钟,然后触发了 GC.Collect 并得到了错误。我可以在一定程度上做到这一点。我已经阅读了一篇又一篇关于这个错误和正确编组的文章,但我不是唯一的编组。 VS 为 COM 对象创建了一个 RCW,我使用它,所以我在那里没有控制权,还是我?除了理论上的闲聊之外,没有一篇文章给我任何代码示例或任何其他内容。

有没有更好的方法来做到这一点?我怎样才能找到导致错误的确切原因?似乎没有办法隔离这件事。我从微软的一个人那里找到一篇文章,称其为“沉默的刺客”,但他没有给出任何解决方案,并且基本上承认 MS 也没有任何解决方案。 Read Here

我束手无策。任何帮助表示赞赏。

【问题讨论】:

    标签: c# com marshalling com-interop


    【解决方案1】:

    嗯,这是您使用的 COM 服务器的严重缺陷。是的,它是由 CLR 间接触发的,当终结器线程运行 RCW 终结器时,会释放 COM 对象的最后一个引用计数。 Marshal.ReleaseComObject 将引用计数减为 0,COM 服务器的 IUnknown::Release() 实现方法将清理该对象。

    对于 COM 服务器而言,这始终是易受攻击的时间。当它较早损坏堆时,触发 CPU 硬件故障(AV = Access Violation)的常见时间是它释放内存时。微软为这个硬件异常设置了一个捕捉器来帮助诊断问题。没有它,你几乎没有机会弄清楚发生了什么,因为终结器在一个不可预测的时间运行,而你自己的任何代码都没有主动运行。

    这个错误非常严重,你留下了一个损坏的堆,只清理了一部分。如果你继续前进,你通常会得到更多的 AV 和/或你会泄漏内存。最坏的结果,很可能是顺便说一句,它不会在之后死掉,而是开始生成坏数据或行为不可预测,导致你认为是你的代码有问题。

    只有一方可以解决此问题,即此 COM 服务器的供应商。仔细指定您正在运行的机器,尤其是操作系统版本很重要,并给他们一小段代码(包括源代码)来重现异常。保持它小巧且高度可见很重要,否则他们会声称是您的代码破坏了堆。无论如何,他们很可能会这样做,堆损坏非常难以调试。如果您无法让他们响应,您最好购买其他供应商。

    【讨论】:

    • 汉斯,感谢您的回复。至少我觉得我不会发疯。你可以理解这是多么令人沮丧。让 COM 服务器的供应商解决这个问题的困难在于,他们提供带有 COM 服务器的 SDK,作为购买呼叫记录器软件套件的礼貌。我不认为他们真的相信除了他们自己以外的任何人都会冒险处理它。我假设即使我使用另一种语言(如 VB)也会遇到同样的问题?再次感谢。
    • 是的,语言与它无关。轰炸的是他们的代码。
    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多