如何知道在给定情况下调试/配置挂起的C#应用程序

如何知道在给定情况下调试/配置挂起的C#应用程序,c#,.net,multithreading,visual-studio-2010,debugging,C#,.net,Multithreading,Visual Studio 2010,Debugging,我有一个用C编写的线程程序(控制台应用程序)# 它在6-10小时内运行正常,但出现故障并停止,控制台不关闭,并显示最后一次成功的日志 错误日志(所有可能的)写入文件 即使发生IO异常,它也会将其写入Windows事件中 还有内存保护和线程保护,它们将程序限制到给定的限制 当它停止(6-10小时后)什么也没有发生没有错误日志,心跳,数据库调用,内存使用,我可以看到线程是产卵约70%的最大限制设置 我知道这可能是内存泄漏,因为由于数据库调用延迟,线程可能无法释放 我只是想处理这个停止的应用程序,以了

我有一个用C编写的线程程序(控制台应用程序)#

它在6-10小时内运行正常,但出现故障并停止,控制台不关闭,并显示最后一次成功的日志

错误日志(所有可能的)写入文件

即使发生IO异常,它也会将其写入Windows事件中

还有内存保护和线程保护,它们将程序限制到给定的限制

当它停止(6-10小时后)什么也没有发生没有错误日志,心跳,数据库调用,内存使用,我可以看到线程是产卵约70%的最大限制设置

我知道这可能是内存泄漏,因为由于数据库调用延迟,线程可能无法释放

我只是想处理这个停止的应用程序,以了解确切的问题,比如内存泄漏在哪里,或者哪个调用会阻塞

是否有任何工具可用于此挂起/停止的应用程序?应该以什么样的方式进行

我使用了ANTS memory pro filer和performance pro filer,但所有这些工具都适用于运行的应用程序

我能得到的最多的是内存转储

欢迎提出建议

编辑: 最初我不想重新运行它等待数小时进行调试,如果没有办法,那将是最后一个选项

我尝试附加调试器并放置断点,它说“断点当前不会命中…”

尝试它完全满足您的需要,并且有一个易于理解的向导来解决不同的问题


如果您不想使用此工具,我会在挂起进程上附加一个调试器,您至少应该能够看到哪些线程仍在运行,以及在哪个模块中运行。首先,您应该查看事件查看器。 然后,如果应用程序在没有日志的情况下崩溃,则可能是由于未处理的异常。 将以下代码放入主方法中:

Application.ThreadException += (sender, arg) => { log.Error("Unhandled exception : "+e.Exception);};
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

祝您好运

您能在Visual Studio中以调试模式运行该应用程序吗?也许,您可以在内存转储上工作,以确定应用程序运行时执行的线程。在多线程应用程序中,有一个小的代码块会影响整个系统。它是WPF应用程序还是win form应用程序?如果是WPF,请注意与线程一起使用的事件,并尝试使用弱事件,而不是创建强引用且在大多数情况下不会自动释放的正常事件。如果是winform应用程序,最好是仔细查看创建线程的代码,并可能使用后台工作线程以实现高效使用。在我看来,您必须在应用程序挂起之前找到错误,因为在应用程序停止响应后,工具也无法报告太多。请重新访问问题编辑:部分这听起来像死锁,一个典型的线程问题。如果这种情况不经常发生,并且您无法在您的开发机器上复制它,那么调试将非常困难。您确实需要到达一个可以附加调试器或打开迷你转储的点,以查看发生了什么。对于程序中的线程错误,最典型的解决方法是剧烈的重写。