我有这个问题,一天中的大部分时间都让我感到悲伤,然后是一些 基本上我的Debug.WriteLine工作了一点,然后神奇地停止给出输出。调试器仍在工作,因为我可以在行上放置一个断点,它会中断,我可以跳过Debug.WriteLine并观察它不输出。
现在我已经检查了我能想到的一切。我已尝试过各种帖子中的内容,例如
Debug.Writeline is Not printing anything
Visual Studio 2010 suddenly stops displaying Debug output
但没有任何效果。澄清
在完成所有建议之后,我没有解决问题。上述帖子中没有一个真正得到回复。
那么如何解决这个问题?
我以为我会创建一个单独的解决方案来重现这个问题。
您可以在此处下载我的解决方案https://drive.google.com/uc?export=download&confirm=&id=0B0SLafLeQj5GOGxORThMWWhYV28
所以我制作了2个Windows应用程序,并将它们设置为同时启动。在每个应用程序中,我启动一个线程,在线程中我做一个Debug.WriteLine
似乎遇到某种死锁并停止写输出。这似乎是Visual Studio中的一个错误,我对此感到非常惊讶。我是否必须相信,有两个项目的线程同时执行Debug.WriteLine是不可能的?
再一次,我非常需要一种方法来解决这个问题并且仍然获得调试输出。 哦,我也尝试过将输出重定向到即时窗口但没有成功的选项。
答案 0 :(得分:5)
视觉工作室似乎有一个错误。我使用.net反射器深入研究CLR并发现它的锁定似乎只适用于每个进程级别。因此,当您只运行一个项目时,DefaultTraceListener似乎可以正常使用多线程,但是只要您运行多个项目,它就会产生某种死锁并停止工作。
我通过为Debug.WriteLine创建一个包装器来解决这个问题,然后我将Global Mutex实现为围绕写入的锁定。 Mutex是win32互斥锁的包装器,因此可以在系统的进程级别上运行。
在这里看到我的代码,我把它放在我在两个项目中引用的类lib中,而不是使用System.Diagnostics下的普通Debug.WriteLine:
public class Debug
{
#if DEBUG
private static readonly Mutex DebugMutex =new Mutex(false,@"Global\DebugMutex");
#endif
[Conditional("DEBUG")]
public static void WriteLine(string message)
{
DebugMutex.WaitOne();
System.Diagnostics.Debug.WriteLine(message);
DebugMutex.ReleaseMutex();
}
[Conditional("DEBUG")]
public static void WriteLine(string message, string category)
{
DebugMutex.WaitOne();
System.Diagnostics.Debug.WriteLine(message,category);
DebugMutex.ReleaseMutex();
}
}
希望这有帮助!
斯蒂德。
答案 1 :(得分:5)
确认输出窗口的上下文菜单已选中“程序输出”。我的调试语句没有跟踪。即使我没有取消选中该选项,这也未经检查。检查它为我修好了。