Debug.WriteLine () не ударил - PullRequest
       28

Debug.WriteLine () не ударил

1 голос
/ 16 августа 2011

Я отлаживаю службу Windows (нажав F5 в Visual Studio 2010), используя следующий код:

В Program.cs Файл:

static void Main() {

    if (!Environment.UserInteractive) {
        // We are not in debug mode, startup as service

        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new MyServer() };
        ServiceBase.Run(ServicesToRun);
    } 
    else {
        // We are in debug mode, startup as application

        MyServer service = new MyServer();
        service.StartService();
        System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    }
}

И в MyServer.cs файл:

public void StartService() {
    this.OnStart(new string[0]);
}

Раньше я без проблем использовал строку Debug.WriteLine("xxx") во всем своем служебном коде, но теперь я заметил, что все строки Debug.WriteLine() больше не вызываются.

Я ясно вижу, что отладчик перепрыгивает через эти строки, когда я отлаживаю с помощью Step Into (F11) - (таким образом, нет выходного текста в окне вывода), тогда как сервис правильно запущен в «режиме отладки» .

Я не понимаю, почему не будет вызван код Debug. Предложения?

Я строю свое решение в режиме отладки (проверено Define DEBUG constant), но я заметил, что код, окруженный #if DEBUG ... #endif, не вызывается. Это странно ...

Ответы [ 5 ]

5 голосов
/ 16 августа 2011

Кажется, что символы отладки отсутствуют.

  1. Очистите решение, перезапустите Visual Studio, перестройте решение.
  2. Убедитесь, что Configuration Manager находится в режиме отладки.
  3. Выберите Инструменты> Параметры> Отладка и снимите флажок «Включить только мой код»

Произошло со мной, и это, казалось, помогло.

1 голос
/ 28 марта 2014

У меня была та же случайная проблема.

Я смог просто исправить это:

  1. Снимите отметку Project Properties -> Build -> Define DEBUG constant
  2. Нажмите Сохранить
  3. Установите флажок 'Define DEBUG constant' снова
  4. Нажмите Сохранить
  5. Перестройте проект
  6. Выполните

После этого он достиг линии #if DEBUG, как и ожидалось.

1 голос
/ 16 августа 2011

Если вы не используете отладочную сборку, код исключается компилятором. Сигнатура метода имеет нечто похожее на:

[Conditional("DEBUG")]
public static void WriteLine(string message) { }

Этот атрибут указывает компилятору только включать вызовы для рассматриваемого метода при выполнении отладочных сборок. Поэтому, если вы не компилируете с установленным флагом DEBUG (скажем, сборкой релиза), то компилятор вообще отбросит вызов.

То же самое верно для Debug.Assert.

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

Еще один способ думать об этом атрибуте состоит в том, что он заставляет все вызовы метода, имеющего атрибут, быть заключенным в директивы - что-то вроде:

    DoSomething();

#if DEBUG
    Debug.WriteLine("I'm a debug build");
#endif

    DoSomethingElse();

EDIT

Чего вы пытаетесь достичь с помощью Environment.UserInteractive? Возможно, вы имеете в виду Debugger.IsAttached? Если вы хотите проверить, является ли это отладочной сборкой, вы можете использовать директивы ConditionalAttribute, как указано выше, или #if #endif.

0 голосов
/ 16 августа 2011

Перейдите в Свойства проекта -> Построить и убедитесь, что установлены флажки «Определить постоянную отладки» и «Определить постоянную трассы».

0 голосов
/ 16 августа 2011

Environment.UserInteractive - это не то же самое, что режим отладки - это просто означает, что вы запускаете его в консоли, а не в качестве службы. Убедитесь, что для вашей конфигурации сборки установлено значение Debug.

...