Код «Только отладка», который должен запускаться только при «включении» - PullRequest
80 голосов
/ 22 февраля 2011

Я хотел бы добавить код C # «только отладка», который запускается только в том случае, если отлаживаемый человек запрашивает его. В C ++ я делал что-то похожее на следующее:

void foo()
{   
  // ...
#ifdef DEBUG
  static bool s_bDoDebugOnlyCode = false;
  if (s_bDoDebugOnlyCode)
  {
      // Debug only code here gets executed when the person debugging 
      // manually sets the bool above to true.  It then stays for the rest
      // of the session until they set it to false.
  }
#endif
 // ...
}

Я не могу сделать то же самое в C #, потому что нет локальной статики.

Вопрос : Каков наилучший способ сделать это в C #?

  1. Стоит ли использовать статическое поле частного класса с директивами препроцессора C # (# if / # endif DEBUG)?
  2. Должен ли я использовать атрибут Conditional (для хранения кода), а затем статическое поле частного класса ( не , окруженное директивами препроцессора C # # if / # endif DEBUG?).
  3. Что-то еще?

Ответы [ 5 ]

126 голосов
/ 22 февраля 2011

Переменная экземпляра, вероятно, будет способом сделать то, что вы хотите.Вы можете сделать его статическим, чтобы сохранить одно и то же значение в течение жизни программы (или потока в зависимости от вашей статической модели памяти), или сделать его обычным экземпляром var, чтобы управлять им в течение жизни экземпляра объекта.Если этот экземпляр является одиночным, они будут вести себя одинаково.

#if DEBUG
private /*static*/ bool s_bDoDebugOnlyCode = false;
#endif

void foo()
{   
  // ...
#if DEBUG
  if (s_bDoDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }
#endif
 // ...
}

Просто чтобы завершить, прагмы (директивы препроцессора) считаются чем-то вроде клуджа, используемого для управления потоком программ.В .NET есть встроенный ответ на половину этой проблемы, использующий атрибут «Условный».

private /*static*/ bool doDebugOnlyCode = false; 
[Conditional("DEBUG")]
void foo()
{   
  // ...    
  if (doDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }    
  // ...
}

Нет прагм, намного чище.Недостатком является то, что Условное можно применять только к методам, поэтому вам придется иметь дело с булевой переменной, которая ничего не делает в сборке релиза.Поскольку переменная существует исключительно для переключения с хоста исполнения VS, и в сборке выпуска ее значение не имеет значения, оно довольно безвредно.

59 голосов
/ 10 июля 2012

То, что вам нужно, это атрибут

[ConditionalAttribute("DEBUG")]

.

Если вы, например, напишите такой метод, как:

[ConditionalAttribute("DEBUG")]
public static void MyLovelyDebugInfoMethod(string message)
{
    Console.WriteLine("This message was brought to you by your debugger : ");
    Console.WriteLine(message);
}

любой вызов, который вы сделаетеэтот метод внутри вашего собственного кода будет выполняться только в режиме отладки.Если вы строите свой проект в режиме выпуска, даже вызов «MyLovelyDebugInfoMethod» будет игнорироваться и выгружаться из вашего двоичного файла.

О, и еще одна вещь, если вы пытаетесь определить, является ли ваш кодв настоящее время отлаживается в момент выполнения, также возможно проверить, перехватывается ли текущий процесс JIT.Но это все вместе другой случай.Оставьте комментарий, если это то, что вы пытаетесь сделать.

19 голосов
/ 19 июня 2014

Вы можете попробовать это, если вам нужен только код для запуска, когда к процессу подключен отладчик.

if (Debugger.IsAttached)
{
     // do some stuff here
}
3 голосов
/ 17 октября 2014

Думаю, стоит упомянуть, что [ConditionalAttribute] находится в пространстве имен System.Diagnostics;.Я немного споткнулся, когда получил:

Error 2 The type or namespace name 'ConditionalAttribute' could not be found (are you missing a using directive or an assembly reference?)

после первого использования (я думал, что это будет в System).

3 голосов
/ 08 января 2014

Если вы хотите знать, если отладка, везде в программе. Используйте это.

Объявление глобальной переменной.

bool isDebug=false;

Создать функцию для проверки режима отладки

[ConditionalAttribute("DEBUG")]
    public static void isDebugging()
    {
        isDebug = true;
    }

В методе initialize вызвать функцию

isDebugging();

Теперь во всей программе. Вы можете проверить на наличие ошибок и выполнить операции. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...