Где появляется вывод System.Diagnostics.Debug.Write?

147

Следующая программа C # (построенная с csc hello.cs) печатает только Hello via Console!на консоли и Hello via OutputDebugStringв окне DebugView. Однако я не вижу ни одного из System.Diagnostics.*звонков. Это почему?

using System;
using System.Runtime.InteropServices;
class Hello {
    [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
    public static extern void OutputDebugString(string message);

    static void Main() {
        Console.Write( "Hello via Console!" );
        System.Diagnostics.Debug.Write( "Hello via Debug!" );
        System.Diagnostics.Trace.Write( "Hello via Trace!" );
        OutputDebugString( "Hello via OutputDebugString" );
    }
}

Может быть, для этого требуются специальные ключи командной строки csc?

Я не использую Visual Studio ни для каких моих разработок, это чисто командная строка.

Фрерих Раабе
источник
как уже упоминалось в некоторых комментариях в другом ответе, можно использовать DebugView от Microsoft (SysInternals): technet.microsoft.com/en-us/sysinternals/bb896647.aspx
Джордж Бирбилис

Ответы:

77

Как уже отмечали другие, слушатели должны быть зарегистрированы, чтобы читать эти потоки. Также обратите внимание, что Debug.Writeбудет работать только если установлен DEBUGфлаг сборки, а Trace.Writeбудет работать только если установлен TRACEфлаг сборки.

Установка флагов DEBUGи / или TRACEлегко выполняется в свойствах проекта в Visual Studio или путем предоставления следующих аргументов в csc.exe

/define:DEBUG;TRACE

Tormod Fjeldskår
источник
5
Для меня было полезно (не ожидало этого) выяснить, что объекты Debug и Trace используют одни и те же прослушиватели трассировки, поэтому и Debug.Write, и Trace.Write выводят в одно и то же место (места), просто это зависит на условиях, которые они могут не выполнить
hello_earth
1
не могли бы вы уточнить, на каких условиях они находятся? В какой именно ситуации debug.Write не будет работать так же, как trace.write?
Пейсер
2
это не работает для меня, у меня установлены отладочные и трассировочные флаги в свойствах проекта против, и я использую Debug.WriteLine, строка выполняется, но ничего не появляется в окне вывода, кто-нибудь получил какой-либо другой совет?
f1wade
114

Хотя отладка System.Diagnostics.Debug.WriteLineбудет отображаться в окне вывода ( Ctrl+ Alt+ O), вы также можете добавить TraceListenerв Debug.Listenersколлекцию, чтобы указать Debug.WriteLineвызовы для вывода в других местах.

Примечание: Debug.WriteLineвызовы могут не отображаться в окне вывода, если у вас установлен флажок Visual Studio «Перенаправить весь текст окна вывода в окно немедленного действия» в меню « Инструменты» → « Параметры» → « Отладка» → « Общие» . Чтобы отобразить « ИнструментыПараметрыОтладка », установите флажок рядом с « ИнструментыПараметрыПоказать все настройки ».

boardernin
источник
4
Я хотел бы подтвердить, что (Ctrl + Alt + O) вызовет окно вывода при отладке в Visual Studio 2012
Исикава
45

Вам нужно добавить, TraceListenerчтобы они появлялись на консоли.

TextWriterTraceListener writer = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(writer);

Они также появляются в окне вывода Visual Studio в режиме отладки.

Ясон
источник
2
Видимо DebugView захватит как .NET Debug.Write () и Win32 OutputDebugString (): technet.microsoft.com/en-us/sysinternals/bb896647
dlchambers
@dlchambers: я не думаю, что это правильно. Эта страница требует отображения OutputDebugString()и (ядро)DbgPrint().
Майк C
1
@dlchambers: я отозвал комментарий; Я обнаружил, что DebugView может захватывать, Debug.Write() если его настройки Capture включают «Global Win32» - что требует запуска его в режиме администратора.
Майк С
10

Во время отладки в Visual Studio откройте окно «Вывод» («Просмотр»> «Вывод»). Это покажет там.

похлопывание
источник
6

Диагностические сообщения отображаются в окне вывода.

Андреас Греч
источник
5

Когда я пишу debug.write ("") в коде, он выводится в "Немедленном окне", а не "Окно вывода".

Можешь попробовать. Для отображения окна «Немедленно» (« Отладка» → « Окно» → « Немедленно» ).

kykbr
источник
2

Решение для моего случая:

  1. Щелкните правой кнопкой мыши окно вывода;
  2. Проверьте «Выход программы»
Нин Чжу
источник
0

Для VB.NET действует следующее. Вы должны выбрать «Debug» и убедиться, что вы «Start Debugging». Это может быть достигнуто нажатием F5.

Также Console.WriteLine будет отображать сообщения только при сборке как «Release» в вашем окне вывода.

Как упоминалось ранее, откройте окно Вывод с помощью ViewOutput AND и убедитесь, что вы выбрали либо «Build», если вы хотите видеть сообщения Console.WriteLine, либо «Debug», если вы хотите видеть сообщения Debug.WriteLine или Trace.WriteLine.

Маттис Кохли
источник