.NET应用程序挂起,我可以';我不能调试它

.NET应用程序挂起,我可以';我不能调试它,.net,visual-studio,debugging,.net,Visual Studio,Debugging,我正在为Syslog开发一个多线程C#server。我试图执行一个长时间运行的实验,但我发现在一小时后服务器挂起(在一段时间后,日志停止) 然后我尝试在Visual Studio中以Debug模式运行它,当我发现它挂起并尝试按Pause以获取有关线程位置的有用信息时,Visual Studio说远程调试监视器崩溃了。这是本地应用程序 如何暂停进程并获取有关线程状态的有用信息?将轮询托管应用程序并记录当前发生的情况 可能也很有用(关于挂起模式转储的部分),但需要调试崩溃转储文件(WinDbg不像V

我正在为Syslog开发一个多线程C#server。我试图执行一个长时间运行的实验,但我发现在一小时后服务器挂起(在一段时间后,日志停止)

然后我尝试在Visual Studio中以
Debug
模式运行它,当我发现它挂起并尝试按Pause以获取有关线程位置的有用信息时,Visual Studio说远程调试监视器崩溃了。这是本地应用程序

如何暂停进程并获取有关线程状态的有用信息?

将轮询托管应用程序并记录当前发生的情况


可能也很有用(关于挂起模式转储的部分),但需要调试崩溃转储文件(WinDbg不像Visual Studio那么容易理解,需要一些时间学习)

我会尝试StingyJack的建议,但我相信使用Debug.WriteLine()和Sysinternal的DebugView来查看发生了什么,轻量级跟踪是无法替代的


这就是我的出发点VS的功能不足以帮助您调试多线程服务。有时甚至可能取决于对象的状态,请记住,在调试时,会中断正常的事件流。

WinDBG对于VS无法捕获的低级问题是一个很好的替代方案。您可以在这里找到更多信息:

Hmm。。。我试过了,但它只显示了devenv.exe和dexplore.exe(我有3个VS2008实例在运行,1个用于服务器调试,1个用于客户端调试,另一个空闲)…只需将MSE附加到当前运行的进程,不需要调试器。尽管我喜欢VS中调试的简单性,@Aliostad是正确的-即使在最好的情况下,当您连接了调试器时,事件的顺序可能不会镜像未连接调试器时的事件顺序,因此当您尝试在调试器中捕获竞争条件和生产中的其他错误时,它们可能会消失。Debug.WriteLine是故障安全的,是调试多线程应用程序的唯一完全可靠的方法(尽管很痛苦)。通过跟踪调试随机死锁非常棘手,更改的计时可能会解决死锁问题。或者立即触发,而不必等待一个小时。当然,这只有在月亮在水瓶座的时候才会发生。我确信,如果这是一个有管理的僵局,我就能够检测到它。过去,我总是能成功地发现它们。幸运的是,我可能已经隔离了一个可能导致麻烦的组件,将平台目标强制到x86,这样您就不必处理远程调试器。不幸的是,没有结果。我正在运行Windows7x64。我应该强制x64吗?