我正在修复应用程序上的错误,这是一种数据使用者/工作者,从第三方应用程序获取数据,使用提供的API和库来执行此操作。它是基于c ++的API,而.net应用程序使用一些c ++来访问库。此外 - 应用程序是多线程的,它是窗口(Winforms),使用几个第三方库(nhibernate,mysql和其他)。可能有必要在访问c ++库时添加,我们的消费者线程是代码中唯一的位置。
问题?当生产应用程序关闭(花费更多时间,超过一分钟)时,消费者应用程序会在几秒钟内死亡,没有错误/异常 - 甚至认为它们是独立打开的。事件日志中没有信息,没有Dr.Watson操作,Visual Studio中没有例外(调试只是停止)。
我试过了:
找出消费者应用程序死亡原因的好方向是什么?是否有办法解决问题(比如向用户显示提示信息,例如:“生产应用程序正在关闭,消费者应用程序也会这样做!”)?
[编辑]
消费者应用程序是多线程的,它是一个消费者线程作为UI线程的插件。此外 - 我们作为制作人使用的第三方应用程序使用COM将信息发送到任何消费者应用程序(也称为附加组件)。
我和我的同事决定评论一些代码,找到可能导致问题的代码。也许我们已经找到了 - 当且仅当我们将我们的消费者注册到生产者时,应用程序才会死亡。在阅读第三方应用程序的文档后,结果发现消费者应用程序必须主动查询关闭生产者的消息,否则它们将被生产者应用程序强行终止。
所以:95%的问题是第三方应用程序,我们正在查询数据是发送COM消息强行终止我们的应用程序(我会发布信息/更改为维基,如果我们测试它是唯一的原因)。
答案 0 :(得分:3)
这里描述的一般情况是一个非常常见的混淆和误解的来源,这个混淆和误解与人们试图理解'我的应用程序如何在没有任何痕迹的情况下消失的情况有关?'
直接的假设是:我的申请'死亡或'崩溃' 或'遇到了这样的意外异常,调试器甚至看不到它,因此没有创建任何转储文件。好几次发生在我身上......
在大多数情况下,真正的答案是应用程序没有真正崩溃或死亡并且没有得到任何重复,但只是优雅地关闭,但是从我没有的流程期望的。
调试此类案例的最简单方法是在kernel32!ExitProcess
中放置一个断点并跟踪堆栈,看看我们是如何到达这里的。
希望这有帮助
答案 1 :(得分:0)
事实证明,它是主机应用程序,它会杀死我的应用程序。调试问题的正确方法是监视Windows消息并查看我的应用程序正在获取Process Terminate消息。