Можно ли просмотреть выходные данные из OutputDebugString в окне вывода Visual Studio? - PullRequest
19 голосов
/ 14 июня 2010

Я использую C # и Visual Studio 2010.

Когда я использую OutputDebugString для записи отладочной информации, должна ли она отображаться в окне вывода?

Я вижу вывод изOutputDebugString в DebugView , но я подумал, что увижу его в окне вывода Visual Studio.Я посмотрел в меню Инструменты ? Опции ? Отладка ? General , и выход НЕ перенаправляется в окно Immediate.Я также посмотрел в меню Инструменты *? Опции ? Отладка ? Окно вывода и все общие настройки вывода установлены на «Вкл.».Наконец, я использовал раскрывающийся список в окне «Вывод», чтобы указать, что сообщения отладки должны отображаться.

Если я изменю меню Сервис *? Опции ? Отладка ? General для перенаправления вывода в окно Immediate, сообщения OutputDebugString не появляются в окне непосредственного доступа.

Вот вся моя тестовая программа:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace OutputDebugString
{
  class Program
  {
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern void OutputDebugString(string message);

    static void Main(string[] args)
    {
      Console.WriteLine("Main - Enter - Console.WriteLine");
      Debug.WriteLine("Main - Enter - Debug.WriteLine");
      OutputDebugString("Main - Enter - OutputDebugString");
      OutputDebugString("Main - Exit - OutputDebugString");
      Debug.WriteLine("Main - Exit - Debug.WriteLine");
      Console.WriteLine("Main - Exit - Console.WriteLine");
    }
  }
}

Если я запускаю в отладчике, вывод Debug.WriteLine отображается в окне вывода, а вывод OutputDebugString - нет.

Если я запускаю из окна консоли, то Debug.WriteLine и OutputDebugString отображаются в DebugView.

Почему вывод OutputDebugString никогда не отображается в окне вывода?

В конечном счете, я не намерен писать много отладочной информации сOutputDebugString, скорее я буду использовать System.Diagnostics или NLog или что-то подобное.Я просто пытаюсь выяснить, если я настрою платформу журналирования для записи в OutputDebugString, будут ли выходные данные видны из отладчика.

Я вернулся к своей исходной программе (не простой тест выше), который использует TraceSources и TraceListeners, настроенные через файл app.config.Если я настрою источники трассировки для записи в System.Diagnostics.DefaultTraceListener (что задокументировано как запись в OutputDebugString), то вывод источника трассировки ДОЛЖЕН перейти в окно отладки.Однако строки, которые пишутся непосредственно с OutputDebugString (как в моем простом примере), НЕ переходят в окно отладки.Кроме того, если я использую другой TraceListener, который записывает в OutputDebugString (я получил его из Ukadc.Diagnostics в Codeplex), этот вывод НЕ идет в окно отладки.

Одно замечание об Ukadc.Диагностический прослушиватель трассировки ... Ukadc.Diagnostics содержит некоторые прослушиватели трассировки, которые позволяют настраивать форматирование вывода (аналогично форматированию, доступному в log4net, NLog и LAB).Таким образом, с «только» зависимостью от Ukadc.Diagnostics можно использовать «стандартное» ведение журнала диагностики .NET, но я могу получить некоторые расширенные функции (например, форматирование вывода), не становясь зависимым от, возможно, гораздо более крупной платформы.В этом случае я мог бы использовать Ukadc.Diagnostics OutputDebugStringTraceListener для записи выходных данных журнала в окно отладки в том же формате (при желании или в другом формате), как если бы он был записан в файл.

Обратите внимание, что я видел эти вопросы, но они не предоставили рабочего решения:

Здесь и здесь

Ответы [ 3 ]

36 голосов
/ 14 июня 2010

Вы заставили меня задать этот вопрос некоторое время.Ни за что!Способ.

Проект> Свойства> вкладка Отладка, установите флажок «Включить отладку неуправляемого кода».Переименован в «Включить отладку собственного кода» в более поздних версиях VS.С включенным механизмом отладки неуправляемого кода вывод OutputDebugString () теперь правильно перехватывается и направляется в окно вывода.

8 голосов
/ 20 февраля 2011

При отладке (Debug => Start Debugging F5) настройка Project + Properties, вкладка Debug, проверка «Включить отладку неуправляемого кода» работает хорошо.

Когда НЕ отлаживается (Debug => Start Without Debugging CTRL+ F5) вы должны использовать DebugView из библиотеки SysInternals. Загрузить DebugView для Windows v4.76

3 голосов
/ 14 июня 2010

Вместо этого он может отображаться в «Немедленном окне» из-за настройки:

  • Перейдите в Инструменты / Параметры / Отладка / Общие.Снимите флажок «Перенаправить весь текст окна вывода в окно немедленного действия»

или что-то подобное.

...