【问题标题】:How to debug and solve a 'DisconnectedContext' crash?如何调试和解决“DisconnectedContext”崩溃?
【发布时间】:2011-01-04 03:48:56
【问题描述】:

我有一个 GUI 应用程序,它连接到传感器、收集数据并使用 BackgroundWorker 线程在后台处理数据。

就目前而言,我正在使用ProgressChanged 将数据发布到 GUI,这似乎一开始就运作良好。从那以后,我提高了数据速率并发现了一个问题;如果让软件运行几分钟,处理器使用量似乎会上升,直到它在我的机器上的两个内核上达到接近 100%,此时,我收到一条错误消息:

托管调试助手“DisconnectedContext”检测到“myapp.exe”中存在问题。附加信息:上下文 0xe2ba0 已断开连接。从当前上下文(上下文 0xe2d10)中释放接口。这可能会导致损坏或数据丢失。

我在网上阅读了一些内容,这些内容表明如果 GUI 应用程序无法足够快地发送消息,就会发生这种情况。我注意到如果我快速调整窗口大小(即泵出更多消息),我可以更快地引发同样的崩溃,这支持我认为的理论?

所以这里的问题是:

  1. 是否有人同意我关于消息泵送的假设?
  2. 是否还有其他解释?
  3. 有什么方法可以证明吗(也许可以查看队列中的消息数量)?
  4. 这些糟糕的代码气味是否表明我正在以错误的方式处理这件事?

我们将不胜感激地接受任何建议。

【问题讨论】:

    标签: debugging crash c++-cli


    【解决方案1】:

    这听起来像是一个非常具体的问题,我想这就是为什么还没有人回答,但我想我可以帮助解决问题 #3。

    Spy++ 应该能够看到发送到您窗口的消息。我认为您可以使用它来观看消息泵到您的 GUI 并进行调整大小测试。如果您看到尝试处理的消息大量增加,则可能会证实您的假设。

    顺便说一句,我听说您可以将主线程单元从 STAThread 更改为 MTAThread 以使这个 MDA 消失。

    也许您可以修改您的应用程序以将传感器读数输出到文件中,或者以不同的机制将它们排队,而不是不断更新 GUI。 HTH。

    【讨论】:

    • 我尝试了 MTATHread 设置,它似乎只会增加一个偶尔的崩溃。相反,我采用了一种排队机制,并在部分显示代码中发现了一个错误,该错误过度填充了RichTextBoxControl。在这两者之间,看起来我已经解决了这个问题。感谢您的建议。
    • 我已经多次看到这种情况发生了,这肯定是由于尝试从数据生产者线程向其侦听器发送太多ProgressChanged 请求而触发的。
    猜你喜欢
    • 2016-07-06
    • 2015-07-08
    • 1970-01-01
    • 2022-10-17
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多