2

我有这个问题让我在一天中的大部分时间都感到悲伤,然后是一些。
基本上我的 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 中的一个错误,对此我感到非常惊讶。我必须相信不可能有 2 个线程同时执行 Debug.WriteLine 的项目吗?

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

4

2 回答 2

5

视觉工作室中似乎有一个错误。我使用 .net 反射器深入研究 CLR,发现它所做的锁定似乎只在每个进程级别上起作用。因此,当您只运行 1 个项目时,DefaultTraceListener 似乎可以与多线程一起正常工作,但是一旦您运行多个项目,它就会产生某种死锁并停止工作。

我通过为 Debug.WriteLine 创建一个包装器解决了这个问题,然后我在其中实现了一个全局互斥锁作为写入的锁。Mutex 是 win32 互斥锁的包装器,因此可以跨系统的进程级别工作。

请在此处查看我的代码,该代码放在我在两个项目中引用并使用的类库中,而不是 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();
    }

}

希望这可以帮助 !

骏马。

于 2012-10-04T10:54:51.380 回答
5

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

于 2012-10-22T15:03:28.180 回答