【问题标题】:How do you put an "IF DEBUG" condition in a c# program?如何在 c# 程序中放置“IF DEBUG”条件?
【发布时间】:2011-03-04 15:30:39
【问题描述】:

如何在 ac# 程序中添加“IF DEBUG”条件,以便在运行时,如果您在 Debug 模式下运行,它将忽略一组代码,但如果程序处于运行状态,则执行一段代码不在调试模式下运行?可以使用的一种情况是,如果在块的开头获取时间戳,而在块的末尾获取另一个时间戳。它们在运行时几乎不会有所不同。然而,如果您在调试模式下单步执行代码,它们会有很大的不同,并且“if 块”中的错误条件可能会被启动,从而导致某些代码的不及时(双关语)执行。

【问题讨论】:

    标签: c# debugging conditional


    【解决方案1】:

    您只需将代码放在这样的块中:

    #IF DEBUG
    
    //code goes here
    
    #endif
    

    这不是运行时的东西,这是一个预处理器指令,这意味着该块中的代码甚至不会被编译,也不会被包含在内。

    如果要在运行时检查是否在调试,可以检查Debugger.IsAttached

    【讨论】:

    • Debugger.IsAttached,如果您在生产站点上进行远程调试,我相信这是真的。是的,我知道您通常不想这样做,但在某些极端情况下,您无法弄清楚出了什么问题,这可能会有所帮助。如果您使用远程调试,请确保您的“调试”代码不会在生产环境中导致问题。
    • +1 @Nelson:远程调试(附加调试器)是调试 Windows 服务的唯一方法。
    • @SnOrfus - 实际上,这并不完全正确。 :) 我现在找不到代码(我从网站复制的),但我有一个服务设置,如果我选择“调试”构建,它会在 Visual Studio 中运行,具有正常的调试能力。如果我选择“发布”,它将构建只能通过远程调试进行调试的正常可安装服务。如果您希望服务使用调试符号运行,我想您可以创建一个新的构建配置(调试正常服务)。
    • @Nelson:非常有趣,如果你能找到我想看的代码/文章(我自己会开始寻找)。我打算在这里关闭 MSDN 文章:msdn.microsoft.com/en-us/library/7a50syb3(VS.80).aspx
    • @SnOrfus:是的,通常你不能那样调试它,但有些人想出了巧妙的想法。我认为它基本上是作为控制台应用程序运行并手动运行 OnStart()。我明天应该有它。
    【解决方案2】:

    使用预处理指令#if:

    #if debug
        // run in debug mode
    #else
        // run if not in debug mode
    #endif
    

    【讨论】:

      【解决方案3】:

      你也可以使用

      [Conditional("Debug")]
      

      方法的属性。

      【讨论】:

        【解决方案4】:

        更多细节:

        • 您可以包装整个方法或仅包装一个代码块或仅一行代码。
        • 需要加using System.Diagnostics;

        【讨论】:

        • 解决问题的唯一答案
        【解决方案5】:
        #if DEBUG
                // something
        #elif
                // some other thing
        #endif
        

        【讨论】:

        • @KevinDTimm:啊,错过了这一点。别介意,我只是给出了错误的答案
        【解决方案6】:
        #if (DEBUG)
        ...
        #else
        ...
        #endif
        

        请看这里:http://bloggingabout.net/blogs/rick/archive/2005/03/10/2396.aspx

        【讨论】:

        • @KevinDTimm:尽管提问者说“在运行时”,但我不明白为什么预处理器指令无法处理他的特定场景。在调试模式下运行时,他似乎想跳过if (ItTookALongTime) 的东西,因为在调试模式下我们预计它可能需要很长时间......所以为什么不确保在我们编译时排除if (ItTookALongTime) 的东西调试?
        • 因为这不是他要求的 :) 他想要一种打开标志以进行调试的方法,这可能很容易(将来)打开日志记录(例如)。
        【解决方案7】:

        由于所有其他答案(但一个)都没有解决您的问题,让我试试:

        如果您希望有一个运行时开关,您需要一种从您的环境或命令行获取信息的方法。此外,获得该信息后,您需要将其应用到您的程序中。

        1) 为此,您需要一个全局变量。

        bool bDebug;
        

        2) 获取调试信息

        bDebug = strcmp (getEnv ("DebuggingMode"), "1");  // you'll need to mess with this a little - do 'man getenv' and 'man strcmp' for an understanding of what I'm doing
        
        • 或-

        利用getopt()函数查看调试是关闭还是打开

        3) 代码中您要打开调试的每个地方,检查是否设置了 bDebug

           if (bDebug) {
           // do something
           }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-02
          • 2020-03-11
          • 2020-01-09
          • 1970-01-01
          • 2015-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多