C# 当另一个应用程序关闭时,如何调试为什么应用程序会异常终止?
我正在修复一个应用程序上的bug,这是一种数据消费者/工作者,从第三方应用程序获取数据,使用提供的API和库进行修复。它是基于C++的API,.NET应用程序使用C++的一部分来访问库。此外,该应用程序是多线程的,它是带窗口的(Winforms),使用多个第三方库(nhibernate、mysql和其他)。它可能是相关的,我们的消费线程是代码中唯一的地方,当它访问C++库时。 问题出在哪里?当producent应用程序关闭时(需要更多的时间,超过一分钟),消费者应用程序在几秒钟内死亡,没有错误/异常-即使它们是独立打开的。事件日志中没有信息,没有Dr.Watson操作,Visual Studio中没有异常(调试只是停止) 我试过:C# 当另一个应用程序关闭时,如何调试为什么应用程序会异常终止?,c#,c++,.net,debugging,crash,C#,C++,.net,Debugging,Crash,我正在修复一个应用程序上的bug,这是一种数据消费者/工作者,从第三方应用程序获取数据,使用提供的API和库进行修复。它是基于C++的API,.NET应用程序使用C++的一部分来访问库。此外,该应用程序是多线程的,它是带窗口的(Winforms),使用多个第三方库(nhibernate、mysql和其他)。它可能是相关的,我们的消费线程是代码中唯一的地方,当它访问C++库时。 问题出在哪里?当producent应用程序关闭时(需要更多的时间,超过一分钟),消费者应用程序在几秒钟内死亡,没有错误/
- 一步一步地浏览代码,看看它关闭的时刻,但它总是发生在不同的地方,是调用producent的库代码,还是不调用
- 在Visual Studio中调试了应用程序,并将其配置为在任何异常引发时中断,但该应用程序会死机
- 创建崩溃转储(使用ADPlus.vbs)并在其上使用windbg(尽管我对这种低级调试还不熟悉),但是!使用不同的堆栈跟踪分析结果-使我无法跟踪
所以:95%的问题是我们正在查询数据的第三方应用程序正在发送COM消息来强制终止我们的应用程序(如果我们测试它是唯一的原因,我会将信息/更改发布到wiki)。结果是,是主应用程序杀死了我的应用程序。调试问题的正确方法是监视windows消息并查看,我的应用程序正在收到进程终止消息。这里描述的一般场景是一种常见的混淆和误解的来源,与试图理解“为什么我的应用程序消失在稀薄的空气中而不留下任何痕迹”的情况有关 最直接的假设是:我的应用程序“死机”或“崩溃”或“遇到了此类意外异常,调试器甚至看不到这些异常,因此没有创建任何转储文件”。发生在我身上的几次好时光 在大多数情况下,真正的答案是,应用程序没有真正崩溃或死亡,也没有收到任何请求,而是简单地优雅地关闭了,但是来自我没有预料到的流 调试此类情况的最简单方法是在
kernel32中设置断点!ExitProcess
并跟踪堆栈,看看我们是如何到达这里的
希望这能有所帮助我的猜测是,这是由于堆栈溢出造成的,而堆栈溢出通常(并非总是)是导致终止的原因,没有错误。哪个应用程序是多线程的-您的还是第三方的?您的用户线程是否是主(UI)线程的附加线程?此链接可能会有所帮助:过去发生这种情况时,如果我在VS(2010)下运行程序,它不会中断,但输出(或mebe Immediate)窗口将显示异常消息。只是想一想-您是否尝试将事件处理程序添加到AppDomain.CurrentDomain.UnhandledException()另一个想法是,您可以设置调试器以捕获不同类型的异常-在VS中,转到[Debug]菜单并单击[exceptions…]以获取选项。前者不会帮助您处理堆栈溢出或损坏的进程,因为。。。HthAlso将事件处理程序添加到
应用程序.ThreadException
。