Я использую С# и Visual Studio 2010.
Когда я использую OutputDebugString
для записи отладочной информации, должен ли он отображаться в окне вывода?
Я могу видеть вывод OutputDebugString
в DebugView, но я думал, что увижу его в окне вывода Visual Studio. я посмотрел
в меню Tools? Опции? Отладка? General, и выход НЕ перенаправляется в окно Immediate. Я также посмотрел меню Tools *? Опции? Отладка? Окно вывода и все общие параметры вывода установлены на "On". Наконец, я использовал раскрывающийся список в окне "Вывод", чтобы указать, что должны появляться сообщения отладки.
Если я изменяю меню Tools *? Опции? Отладка? 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
не работает.
Если я запускаю из окна консоли, в DebugView отображаются как Debug.WriteLine
, так и OutputDebugString
.
Почему в выходном окне не появляется вывод OutputDebugString
?
В конечном счете, я намерен не писать много отладочного вывода с OutputDebugString
, скорее я буду использовать System.Diagnostics или NLog или что-то подобное. Я просто пытаюсь выяснить, если я настрою платформу регистрации для записи на OutputDebugString
, будет ли вывод отображаться внутри отладчика.
Я вернулся к своей исходной программе (не простой тест выше), который использует TraceSources
и TraceListeners
, настроенные через файл app.config
. Если я сконфигурировал источники трассировки для записи в System.Diagnostics.DefaultTraceListener
(который документирован как запись на OutputDebugString
), тогда выход источника трассировки DOES переходит в окно отладки. Однако строки, которые пишут напрямую с помощью OutputDebugString
(например, в моем простом примере), НЕ идут в окно отладки. Кроме того, если я использую другой TraceListener
, который пишет в OutputDebugString
(я получил один из Ukadc.Diagnostics в Codeplex), этот вывод НЕ идет в окно отладки.
Одна заметка о прослушивателе трассировки Ukadc.Diagnostics... Ukadc.Diagnostics содержит несколько прослушивателей трассировки, которые позволяют настраивать форматирование вывода (аналогично форматированию, доступному в log4net, NLog и LAB). Таким образом, с "только" зависимостью от Ukadc.Diagnostics можно использовать "стандартное" ведение журнала .NET-диагностики, но я могу получить некоторые дополнительные функции (например, форматирование вывода), не становясь зависимыми от, возможно, гораздо большей платформы. В этом случае я мог бы использовать Ukadc.Diagnostics OutputDebugStringTraceListener
для записи вывода журнала в окно отладки в том же формате (при желании или в другом формате), как это было бы, если бы оно было записано в файл.
Обратите внимание, что я видел эти вопросы, но они не обеспечивали рабочего решения: