Где появляется вывод 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


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 «Перенаправить весь текст окна вывода в окно немедленного действия» в меню « Инструменты» → « Параметры» → « Отладка» → « Общие» . Чтобы отобразить « ИнструментыПараметрыОтладка », установите флажок рядом с « ИнструментыПараметрыПоказать все настройки ».


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» - что требует запуска его в режиме администратора.
Майк С



5

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

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


2

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

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

0

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

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

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

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