vs2010 Debug.WriteLine停止工作

时间:2012-10-03 18:28:54

标签: multithreading visual-studio-2010 debugging

我有这个问题,一天中的大部分时间都让我感到悲伤,然后是一些 基本上我的Debug.WriteLine工作了一点,然后神奇地停止给出输出。调试器仍在工作,因为我可以在行上放置一个断点,它会中断,我可以跳过Debug.WriteLine并观察它不输出。

现在我已经检查了我能想到的一切。我已尝试过各种帖子中的内容,例如

Debug.Writeline is Not printing anything

Debug.Writeline stops working

Visual Studio 2010 suddenly stops displaying Debug output

但没有任何效果。澄清

  • 我正在使用vs2010 pro sp1。
  • 项目正在使用.net4框架。
  • 我有调试常量集。
  • 调试器仍然附加,因为我可以设置断点并且它们被命中。
  • 两个项目都设置为在“任何CPU”下构建(我尝试使用X86并且没有帮助)
  • 我在Windows 7 x64上运行

在完成所有建议之后,我没有解决问题。上述帖子中没有一个真正得到回复。

那么如何解决这个问题?

我以为我会创建一个单独的解决方案来重现这个问题。

您可以在此处下载我的解决方案https://drive.google.com/uc?export=download&confirm=&id=0B0SLafLeQj5GOGxORThMWWhYV28

所以我制作了2个Windows应用程序,并将它们设置为同时启动。在每个应用程序中,我启动一个线程,在线程中我做一个Debug.WriteLine

似乎遇到某种死锁并停止写输出。这似乎是Visual Studio中的一个错误,我对此感到非常惊讶。我是否必须相信,有两个项目的线程同时执行Debug.WriteLine是不可能的?

再一次,我非常需要一种方法来解决这个问题并且仍然获得调试输出。 哦,我也尝试过将输出重定向到即时窗口但没有成功的选项。

2 个答案:

答案 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)

确认输出窗口的上下文菜单已选中“程序输出”。我的调试语句没有跟踪。即使我没有取消选中该选项,这也未经检查。检查它为我修好了。