c# – 当另一个应用程序关闭时,如何调试应用程序因无异常而死的原因?

我正在修复应用程序上的错误,这是一种数据使用者/工作者,从第三方应用程序获取数据,使用提供的API和库来执行此操作.它是基于c的API,.net应用程序使用一些c来访问库.此外 – 应用程序是多线程的,它是窗口( Winforms),使用几个第三方库(nhibernate,MysqL和其他).可能有必要添加,当我们的消费者线程访问c库时,它是代码中唯一的位置.

问题?当生产应用程序关闭(花费更多时间,超过一分钟)时,消费者应用程序会在几秒钟内死亡,没有错误/异常 – 甚至认为它们是独立打开的.事件日志中没有信息,没有Dr.Watson操作,Visual Studio中没有例外(调试只是停止).

我试过了:

>逐步遍历代码以查看关闭的时刻,但它总是发生在不同的地方,是否会调用producent的库代码.
>使用Visual Studio调试应用程序,配置为在任何抛出异常时中断 – 但它没有任何东西就死掉了.
>创建崩溃转储(使用Adplus.vbs)并在它们上使用windbg(虽然我不熟悉这种低级调试)但是!analyze会产生不同的堆栈跟踪 – 让我无痕.

找出消费者应用程序死亡原因的好方向是什么?有没有办法解决问题(比如向用户显示提示信息,例如:“生产应用程序正在关闭,消费者应用程序也会这样做!”)?

[编辑]

消费者应用程序是多线程的,它是一个消费者线程作为UI线程的插件.此外 – 我们作为制作人使用的第三方应用程序使用COM将信息发送到任何消费者应用程序(也称为附加组件).

我和我的同事决定评论一些代码,找到可能导致问题的代码.也许我们已经找到了 – 当且仅当我们将我们的消费者注册到生产者时,应用程序才会死亡.在阅读第三方应用程序的文档后,结果发现消费者应用程序必须主动查询关闭生产者的消息,否则它们将被生产者应用程序强制终止.

所以:95%的问题是第三方应用程序,我们正在查询数据是发送COM消息强制终止我们的应用程序(我将发布信息/更改为维基,如果我们测试它是唯一的原因).

解决方法

这里描述的一般情况是一个非常常见的混淆和误解的根源,这些混淆和误解与人们试图理解“我的应用程序如何在没有任何痕迹的情况下消失在空气中的情况”有关.

直接的假设是:我的应用程序’死’或’崩溃’或’遇到这样的意外异常,调试器甚至看不到它,因此没有创建任何转储文件.好几次发生在我身上……

在大多数情况下,真正的答案是应用程序没有真正崩溃或死亡,并没有得到任何重复,但只是优雅地关闭,但从我没想到的流程.

调试此类情况的最简单方法是在kernel32!ExitProcess中放置一个断点并跟踪堆栈,看看我们如何到达这里.

希望这可以帮助

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...