【问题标题】:Why does Debug.Writeline stop working for some projects in the solution?为什么 Debug.Writeline 对解决方案中的某些项目停止工作?
【发布时间】:2019-03-22 21:55:49
【问题描述】:

从 VS 运行代码后,我们有一个包含多个项目的解决方案,通常从 Debug.Writeline 语句中看到的输出不再出现。我提到了多个项目,因为其中一个项目的输出继续出现。但是,另一个项目始终停止显示语句的输出。

它开始让我发疯。我应该提到这也发生在该项目的第二个开发人员身上。有人见过这个,或者有什么想法吗?

【问题讨论】:

    标签: visual-studio-2010


    【解决方案1】:

    在被此折磨多年后,我终于在这个 Stack Overflow 问题中找到了原因和解决方案:vs2010 Debug.WriteLine stops working

    Visual Studio 对 debug.writeline 的处理似乎无法处理每个都正确使用多个线程的多个进程。最终,这两个进程将导致处理输出的部分 Visual Studio 死锁,导致其停止工作。

    解决方案是将您对 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();
         }
    }
    

    或者对于那些使用 VB.NET 的人:

    Imports System.Threading
    
    Public Class Debug
    #If DEBUG Then
      Private Shared ReadOnly DebugMutex As New Mutex(False, "Global\DebugMutex")
    #End If
    
    <Conditional("DEBUG")> _
    Public Shared Sub WriteLine(message As String)
        DebugMutex.WaitOne()
        System.Diagnostics.Debug.WriteLine(message)
        DebugMutex.ReleaseMutex()
    End Sub
    
    <Conditional("DEBUG")> _
    Public Shared Sub WriteLine(message As String, category As String)
        DebugMutex.WaitOne()
        System.Diagnostics.Debug.WriteLine(message, category)
        DebugMutex.ReleaseMutex()
    End Sub
    End Class
    

    【讨论】:

    • 哇,即使需要一些烦人的工作,终于解决了。
    【解决方案2】:

    按照这些步骤,它对我有用

    1. 右键单击您的项目
    2. 选择属性
    3. 选择选项卡构建
    4. 确保选中Define DEBUG constant

    希望对你有帮助

    【讨论】:

    • 感谢您的回复。该选项已在所有项目中被选中。此外,万一其他人在这里发现自己......
    • 这与@Cor 的回答相结合,有助于将 Debug.WriteLine 语句打印到输出窗口。
    【解决方案3】:

    您应该尝试 Microsoft SystemInternals 的 DebugView。

    http://technet.microsoft.com/en-us/sysinternals/bb896647

    问候, 艾伦

    【讨论】:

    • 有趣。并且看起来很有用。但在这种情况下,它并不能真正解决问题。假设我无法安装任何东西,而宁愿让 Visual Studio 按预期工作。
    • 好的。当您将“活动解决方案配置”设置为调试时,请尝试检查您的解决方案配置管理器并查看所有项目是否都处于调试配置中。
    • 嗨 D.,您这边有什么更新吗?确实很奇怪。
    • 我最终使用该设置将所有调试输出发送到即时窗口......奇怪的是,这似乎正在工作。不是我想要的,但至少我有输出。
    【解决方案4】:

    尝试检查解决方案的平台是否设置为任何 CPU 而不是 x86(或 x64)。我使用 x86 启用 Edit and Continue,然后丢失了 Debug 输出。回到 AnyCPU 后,输出也回来了。

    【讨论】:

    • 这肯定是我的问题,因为我的设置和其他有问题的程序员都将我们的设置设置为 x86。我真的不能长期做出这种改变......但我会试一试至少测试一下。
    • 我遇到了同样的问题,换平台确实解决了。
    【解决方案5】:

    我在使用 Visual Studio 2010 时遇到了同样的问题。上述解决方案都不适用于我的情况,但我是这样解决的:

    1. 右键单击您的项目。
    2. 选择属性。
    3. 单击“编译”选项卡。
    4. 向下滚动到“高级编译选项”。
    5. 将“生成调试信息”的值从“pdb-only”更改为 “满”。

    不知道它的确切用途,但现在我的Debug.Print 语句再次出现在即时窗口中,我终于可以重新开始工作了。

    【讨论】:

    • 虽然到屏幕的导航可能与 VS 2010 相关,但即使我们使用 VS 2015,这个问题也是相关的。在 VS 2015 中,“高级”选项位于项目属性的“构建”选项卡内。结合@onmyway133 使用 Debug.WriteLine 语句打印消息到输出窗口的答案对我有用。
    【解决方案6】:

    在 VS 2015 中得到了这个。突然间所有 Debug.WriteLine “停止工作”(未显示在输出窗口中)。在为此疯狂了大约一个小时后,我发现了问题: 1.右键单击In output window(从Debug输出) 2.检查“程序输出”是否被选中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2018-07-05
      • 2021-05-25
      • 2019-10-27
      • 2011-03-28
      相关资源
      最近更新 更多