vs2010 Debug.WriteLine停止工作

Ste*_*eed 2 debugging multithreading visual-studio-2010

我有这个问题一直给我带来悲伤的一天,然后一些.
基本上我的Debug.WriteLine工作了一点,然后神奇地停止给出输出.调试器仍在工作,因为我可以在行上放置一个断点,它会中断,我可以跳过Debug.WriteLine并观察它不输出.

现在我已经检查了我能想到的一切.我曾经尝试过各种各样的帖子

Debug.Writeline不打印任何东西

Debug.Writeline停止工作

Visual Studio 2010突然停止显示调试输出

但没有任何效果.澄清

  • 我正在使用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是不可能的?

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

Ste*_*eed 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 !

骏马.


小智 5

验证输出窗口的上下文菜单是否已选中"程序输出".我的调试语句没有跟踪.即使我没有取消选中该选项,这也未经检查.检查它为我修好了.