Запись в окно вывода Visual Studio


607

Я пытаюсь написать сообщение в окно вывода для целей отладки. Я искал такую ​​функцию, как Java system.out.println(""). Я попробовал Debug.Write, Console.Writeи Trace.Write. Это не выдает ошибку, но и ничего не печатает.

Проверены опции «Определить постоянную отладки» и «Определить постоянную TRACE».

Инструменты меню → ПараметрыОтладка«Перенаправить весь текст окна вывода в окно немедленного действия» не отмечены.

Конфигурация: активная (отладка)

Примечание. Я создал проект с помощью мастера как «Приложение Windows Forms», если это необходимо. Я понятия не имею, где искать.


32
попробуйте использоватьDebug.WriteLine()
Nikson Kanti Paul

9
Поскольку это старый пост, я добавлю его в качестве комментария для тех, кто наткнулся на вопрос. Вместо реального изменения кода вы также можете использовать специальные точки останова, называемые точками трассировки. Смотрите документацию MSDN
Wonko the Sane

13
Напоминаю, что Debug.WriteLine () будет работать только при запуске в Debug. Это означает запуск с F5, а не CTRL-F5. Это легко пропустить.
kirk.burleson

3
Это правда, но удобным инструментом является DebugView, который показывает весь вывод в поток отладки при запуске вне отладчика
the_mandrill

2
Если вы пытаетесь записать выходные данные модульного теста, работающего в среде тестирования Visual Studio, правила немного отличаются, см. Этот ответ для получения подробной информации.
yoyo

Ответы:


754

Добавьте System.Diagnosticsпространство имен, и тогда вы сможете Debug.WriteLine()быстро распечатать сообщение в окне вывода IDE. Для более подробной информации, пожалуйста, обратитесь к ним:


2
Спасибо. Я предполагаю, что нет способа записи в вывод, если я начинаю без отладки (ctrl-f5), верно?
previous_developer

1
Я думаю, вы ищете это: stackoverflow.com/questions/562590/…
Бхаргав Бхат

Еще раз спасибо, но это не сработало для меня. Трассировка не печатается без режима отладки, даже если задана константа TRACE.
previous_developer

Просто запустил небольшое приложение здесь, у меня отлично работает. Возможно, в вашей среде есть небольшой сбой?
Бхаргав Бхат

1
Это мой тестовый код; pastebin.com/b7P0bYEa Это довольно просто, но все еще ничего. Я попробую это в другой системе.
previous_developer

154

Это запишет в окно вывода отладки:

using System.Diagnostics;

Debug.WriteLine("Send to debug output.");

6
Для меня это "вывод" в окно Immediate
nuander

Я попробовал это на множестве модульных тестов. Я отладил выбранный тест, но в окне отладки не было ничего из того, что я пытался распечатать.
Фрэнк Х.

Однако вывод в окно «Отладка» происходит только после закрытия веб-страницы. Я хотел бы немедленного отображения при выполнении кода. Подождите минуту - я обнаружил, что окно вывода скрыто во время выполнения кода. Если я отображаю окно, мой вывод есть.
Джо Коттон

Можем ли мы сохранить журнал этого сообщения, которое печатается в окне отладки? или Visual Studio предоставляет какой-либо способ доступа к журналам окна отладки ..?
Anmol Rathod


55
Debug.WriteLine

это то, что вы ищете.

Если нет, попробуйте сделать это:

Инструменты меню → ПараметрыОтладка → снимите флажок « Отправить вывод немедленно» .


1
Возможно, Debug.Write () не вставляет возврат каретки, поэтому сообщения буферизируются?
Гай Старбак

2
Я не видел Debug.WriteLine («String») до тех пор, пока не сделал то, что сказал Мика. Tools|Options|Debugging uncheck Send Output to Immediate
Skindeep2366 25.09.13

3
Я думаю, что в более поздних версиях флажок «Перенаправить весь текст окна вывода в немедленное окно»
Гудини Сазерленд

6
в VS 2015 это называется: «Перенаправить весь текст окна вывода в окно немедленного действия», на всякий случай некоторым пришлось искать 5 минут, чтобы найти подходящую настройку :) - я прокручивал вверх и вниз, чтобы найти опцию, начинающуюся с « Отправить ... ":)
dba

22

Для меня работало только пространство имен Trace, а не Debug:

System.Diagnostics.Trace.WriteLine("message");

Я работаю в проекте C # под Visual Studio 2010.


2
Я использую VS 2013 Professional и пытаюсь получить выходные данные модульного теста, используя среду модульного тестирования Visual Studio. Похоже, что тестовый жгут захватывает и перенаправляет Debug.WriteLine, но не Trace.WriteLine. И вы не увидите вывод трассировки, если не будете отлаживать тесты (а не просто запускать их).
yoyo

15

Вы можете искать

MessageBox.Show()

или

Debug.Writeline()

8
MessageBox.Show()может быть очень раздражающим, когда вы хотите написать несколько значений для целей отладки.
Дементик

4
Вопрос был "Запись в окно вывода Visual Studio?" не в окне сообщения.
Амир Туиту,

@AmirTwito Окно сообщения - это окно вывода.
ProfK

4
Да, вы правы, но вопрос был «Запись в окно вывода Visual Studio?» а не в простое окно сообщения, использующее этот код: MessageBox.Show ()
Amir Touitou

4
@ProfK Окно вывода Visual Studio является очень специфическим элементом графического интерфейса конкретной программы и MessageBox.Showне записывает в него данные.
jpmc26

9

Звонок

System.Diagnostics.Debug.WriteLine("message");

не работает при работе с .NET Core (V 1.0 или 1.1).

Мы должны создавать и использовать регистратор Microsoft.Extensions.Logging, но этот журнал появляется только во всплывающем окне консоли dotnet.exe, а не в окне «Вывод» Visual Studio.


Таким образом, Debug.WriteLine (), Console.WriteLine () и Trace.WriteLine () ничего не выводят в выводе для .Net Core? Любой способ использовать какую-то простую регистрацию без необходимости писать Logclass? Поиск в Инструменты> Параметры> Отладка и проверил «Показать вывод из:» для возможных решений.
Wouter Vanherck

4

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

Сначала вам нужно установить раковину Serilog's Trace . После установки вам необходимо настроить регистратор следующим образом:

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .CreateLogger();

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

Тогда вы просто регистрируете сообщения в обычном режиме, и они отображаются в вашем окне вывода:

Logger.Information("Did stuff!");

Это не так уж важно, поэтому позвольте мне объяснить некоторые дополнительные преимущества. Самым большим для меня было то, что я мог одновременно войти в окно вывода и на консоль :

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .WriteTo.Console(standardErrorFromLevel: LogEventLevel.Error)
    .CreateLogger();

Это дало мне большую гибкость в отношении того, как я потребляю вывод, без необходимости дублировать все мои звонки на Console.Write с Debug.Write. При написании кода я мог запустить инструмент командной строки в Visual Studio, не боясь потерять вывод при его выходе. Когда я развернул его и мне нужно было что-то отладить (и у меня не было Visual Studio), консольный вывод был легко доступен для моего использования. Те же сообщения также могут быть записаны в файл (или любой другой вид приемника), когда он выполняется как запланированная задача.

Суть в том, что использование Serilog для этого действительно облегчило передачу сообщений во множество мест назначения, гарантируя, что я всегда мог легко получить доступ к выводу независимо от того, как я его запустил.

Это также требует минимальной настройки и кода.


1
Serilog теперь также имеет приемник «debug» на github.com/serilog/serilog-sinks-debug, который работает аналогичным образом, но имеет немного более приятное форматирование :-) HTH!
Николас Блумхардт

Почему бы не сделать общедоступный (может быть статическим) метод .net и поместить туда все, что вам нужно, например, Console.Write или Debug.Write и т. Д., И использовать его везде?
Саулюс

@Saulius "Те же сообщения также могут быть записаны в файл (или любой другой вид приемника), когда он выполняется как запланированное задание. Суть в том, что использование Serilog для этого действительно облегчило вывод сообщений во множество пункты назначения, гарантирующие, что я всегда мог легко получить доступ к выходу независимо от того, как я управлял им. "
jpmc26

1

Это не ответ на оригинальный вопрос. Но так как я нашел этот вопрос при поиске средств интерактивного сброса данных объекта, я подумал, что другие могут выиграть от упоминания этой очень полезной альтернативы.

В конечном итоге я использовал командное окно и ввел Debug.Printкоманду, как показано ниже. Это напечатало объект памяти в формате, который можно скопировать как текст, и это все, что мне действительно нужно.

> Debug.Print <item>

  id: 1
  idt: null
  igad: 99
  igbd: 99
  gl_desc: "New #20"
  te_num: "1-001-001-020"


0

В Visual Studio 2015 у меня сработало следующее:

OutputDebugStringW(L"Write this to Output window in VS14.");

Прочитайте документацию для OutputDebugStringW здесь .

введите описание изображения здесь Обратите внимание, что этот метод работает, только если вы отлаживаете свой код ( debug mode)


11
Это C ++? Вопрос помечен c # .
jpmc26

0

В целях отладки System.Diagnostics.Debug.Writeline() команда не будет скомпилирована в версию выпуска вашего кода, если у вас нет прослушивателей отладки. Он пишет всем слушателям трассировки, который включает окно вывода VS при работе в режиме отладки.

Для консольного приложения. Console.Writeline()будет работать, но вывод будет по-прежнему генерироваться в версии выпуска вашего двоичного файла.

Отладочный вывод также должен появляться в обычном окне вывода при отладке тестов; в то время как вывод console.writeline отсутствует (но его можно найти в окне вывода теста).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.