我正在修复应用程序上的错误,这是一种数据使用者/工作者,从第三方应用程序获取数据,使用提供的 API 和库来执行此操作。它是基于 c++ 的 API,.net 应用程序使用一点 c++ 来访问库。此外 - 该应用程序是多线程的,它是窗口化的(Winforms),使用多个第三方库(nhibernate、mysql 等)。可能需要补充一点,当我们的消费者线程访问 c++ 库时,它是代码中唯一的位置。
问题?当生产应用程序关闭时(需要更多时间,超过一分钟),消费者应用程序会在几秒钟内死亡,没有错误/异常 - 即使它们是独立打开的。事件日志中没有信息,没有 Dr. Watson 操作,Visual Studio 中没有异常(调试只是停止)。
我试过了:
- 遍历代码以查看它关闭的时刻,但它总是发生在不同的地方,它是否调用了生产者的库代码。
- 使用配置为在任何异常抛出时中断的 Visual Studio 调试应用程序 - 但它会一事无成地死去。
- 创建故障转储(使用 ADPlus.vbs)并在其上使用 windbg(不过,我是这种低级调试的新手),但是 !analyze 导致了不同的堆栈跟踪 - 让我无痕。
找出消费者应用程序为何死亡的好方向是什么?有没有办法解决这个问题(比如向用户显示提示消息,比如:“生产者应用程序正在关闭,消费者应用程序也会这样做!”)?
[编辑]
消费者应用程序是多线程的,它是一个消费者线程,作为 UI 线程的插件。此外 - 我们作为生产者使用的第三方应用程序使用 COM 将信息发送到任何消费者应用程序(也称为附加组件)。
我和我的同事决定注释掉一些代码,以找到可能导致问题的代码。也许我们已经找到了——当且仅当我们将消费者注册到生产者时,应用程序才会死掉。看了第三方应用的文档,发现消费者应用必须主动查询关闭生产者的消息,否则会被生产者应用强行终止。
所以:95% 的问题是我们正在查询数据的第三方应用程序正在发送 COM 消息以强制终止我们的应用程序(我会将信息/更改发布到 wiki,如果我们要测试它是唯一的原因)。