Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当另一个应用程序关闭时,如何调试为什么应用程序会异常终止?_C#_C++_.net_Debugging_Crash - Fatal编程技术网

C# 当另一个应用程序关闭时,如何调试为什么应用程序会异常终止?

C# 当另一个应用程序关闭时,如何调试为什么应用程序会异常终止?,c#,c++,.net,debugging,crash,C#,C++,.net,Debugging,Crash,我正在修复一个应用程序上的bug,这是一种数据消费者/工作者,从第三方应用程序获取数据,使用提供的API和库进行修复。它是基于C++的API,.NET应用程序使用C++的一部分来访问库。此外,该应用程序是多线程的,它是带窗口的(Winforms),使用多个第三方库(nhibernate、mysql和其他)。它可能是相关的,我们的消费线程是代码中唯一的地方,当它访问C++库时。 问题出在哪里?当producent应用程序关闭时(需要更多的时间,超过一分钟),消费者应用程序在几秒钟内死亡,没有错误/

我正在修复一个应用程序上的bug,这是一种数据消费者/工作者,从第三方应用程序获取数据,使用提供的API和库进行修复。它是基于C++的API,.NET应用程序使用C++的一部分来访问库。此外,该应用程序是多线程的,它是带窗口的(Winforms),使用多个第三方库(nhibernate、mysql和其他)。它可能是相关的,我们的消费线程是代码中唯一的地方,当它访问C++库时。 问题出在哪里?当producent应用程序关闭时(需要更多的时间,超过一分钟),消费者应用程序在几秒钟内死亡,没有错误/异常-即使它们是独立打开的。事件日志中没有信息,没有Dr.Watson操作,Visual Studio中没有异常(调试只是停止)

我试过:

  • 一步一步地浏览代码,看看它关闭的时刻,但它总是发生在不同的地方,是调用producent的库代码,还是不调用
  • 在Visual Studio中调试了应用程序,并将其配置为在任何异常引发时中断,但该应用程序会死机
  • 创建崩溃转储(使用ADPlus.vbs)并在其上使用windbg(尽管我对这种低级调试还不熟悉),但是!使用不同的堆栈跟踪分析结果-使我无法跟踪
找出消费者应用程序死亡原因的好方向是什么?有没有办法绕过这个问题(比如向用户显示一条提示消息,比如:“Producent应用程序正在关闭,consumer应用程序也将关闭!”)

[编辑]

消费者应用程序是多线程的,它是一个消费者线程,作为UI线程的附加组件。此外,我们作为制作人使用的第三方应用程序使用COM向任何消费者应用程序(又名附加组件)发送信息

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


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

结果是,是主应用程序杀死了我的应用程序。调试问题的正确方法是监视windows消息并查看,我的应用程序正在收到进程终止消息。

这里描述的一般场景是一种常见的混淆和误解的来源,与试图理解“为什么我的应用程序消失在稀薄的空气中而不留下任何痕迹”的情况有关

最直接的假设是:我的应用程序“死机”或“崩溃”或“遇到了此类意外异常,调试器甚至看不到这些异常,因此没有创建任何转储文件”。发生在我身上的几次好时光

在大多数情况下,真正的答案是,应用程序没有真正崩溃或死亡,也没有收到任何请求,而是简单地优雅地关闭了,但是来自我没有预料到的流

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


希望这能有所帮助

我的猜测是,这是由于堆栈溢出造成的,而堆栈溢出通常(并非总是)是导致终止的原因,没有错误。哪个应用程序是多线程的-您的还是第三方的?您的用户线程是否是主(UI)线程的附加线程?此链接可能会有所帮助:过去发生这种情况时,如果我在VS(2010)下运行程序,它不会中断,但输出(或mebe Immediate)窗口将显示异常消息。只是想一想-您是否尝试将事件处理程序添加到AppDomain.CurrentDomain.UnhandledException()另一个想法是,您可以设置调试器以捕获不同类型的异常-在VS中,转到[Debug]菜单并单击[exceptions…]以获取选项。前者不会帮助您处理堆栈溢出或损坏的进程,因为。。。HthAlso将事件处理程序添加到
应用程序.ThreadException