Я использую 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
для записи выходных данных журнала в окно отладки в том же формате (при желании или в другом формате), как если бы он был записан в файл.
Обратите внимание, что я видел эти вопросы, но они не предоставили рабочего решения:
Здесь и здесь