Можно ли просмотреть выходные данные из OutputDebugString в окне вывода Visual Studio?

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

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

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

Если я поменяю меню Инструменты *? Варианты? Отладка? Общие, чтобы перенаправить вывод в окно "Немедленное", 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.Diagnostics... Ukadc.Diagnostics содержит некоторые прослушиватели трассировки, которые позволяют настраивать форматирование вывода (аналогично форматированию, доступному в log4net, NLog и LAB). Таким образом, с "только" зависимостью от Ukadc.Diagnostics можно использовать "стандартное" ведение журнала диагностики.NET, но я могу получить некоторые расширенные функции (например, форматирование вывода), не становясь зависимым от, возможно, гораздо более крупной платформы. В этом случае я мог бы использовать Ukadc.Diagnostics OutputDebugStringTraceListener записать вывод журнала в окно отладки в том же формате (при желании или в другом формате), как если бы он был записан в файл.

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

Здесь и здесь

5 ответов

Решение

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

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

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

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

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

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

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

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

У меня также было Решение> Общие свойства> Зависимости проекта> отмечена моя DLL в моем проекте C#, но зависимости сборки не работали.

Исправление обеих этих проблем заключалось в следующем: Решение> Свойства конфигурации> отметьте сборку в моей DLL.

У меня была эта проблема один раз, и все решения, предложенные в этой теме, не увенчались успехом. DebugView мог видеть отладочные сообщения, а Visual Studio 2017 — нет, как бы я ни пытался его настроить. Включить отладку собственного кода? Проверять. Нет переадресации на "немедленно"? Проверять. Проект не исключается из компиляции? Проверять.

В конце концов я решил проблему с помощью установщика Visual Studio, используя опцию «Восстановить» в моей установке. На выполнение ушло около 10 минут.

Другие вопросы по тегам