Подтвердить что ты не робот

Может ли вывод OutputDebugString выводиться в окне вывода Visual Studio?

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

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

Здесь и здесь

4b9b3361

Ответ 1

Ты заставил меня заняться этим вопросом некоторое время. Ни за что! Путь.

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

Ответ 2

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

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

Ответ 3

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

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

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