Захватить консольный вывод для отладки в VS?

В настройках внешних инструментов VS есть флажок "Использовать окно вывода", который фиксирует вывод командной строки инструментов и выводит его на вкладку VS.

Вопрос: могу ли я получить ту же обработку для моей программы, когда я нажму F5?

Изменить: FWIW Я в C#, но если это имеет значение для вашего ответа, то вряд ли ваш ответ - то, что я ищу.

Я хотел бы взять поток вывода программы и перенести его на вкладку вывода в VS, используя те же устройства, которые использует перенаправление вывода ('|' и '>') в командной строке cmd.

6 ответов

Решение

Я собираюсь сделать несколько предположений здесь. Во-первых, я предполагаю, что вы говорите о выводе printf из приложения (будь то из приложения консоли или из приложения с графическим интерфейсом Windows). Мое второе предположение - язык Си.

Насколько мне известно, вы не можете направить вывод printf в окно вывода в dev studio, во всяком случае, напрямую. [выделение добавлено OP]

Возможно, есть способ, но я не знаю об этом. Единственное, что вы могли бы сделать, это направить вызовы функции printf к вашей собственной подпрограмме, которая будет

  1. вызовите printf и напечатайте строку
  2. вызовите OuputDebugString() для печати строки в окне вывода

Вы могли бы сделать несколько вещей для достижения этой цели. Сначала нужно написать свою собственную функцию printf, а затем вызвать printf и OuputDebugString().

void my_printf(const char *format, ...)
{
    char buf[2048];

    // get the arg list and format it into a string
    va_start(arglist, format);
    vsprintf_s(buf, 2048, format, arglist);
    va_end(arglist); 

    vprintf_s(buf);            // prints to the standard output stream
    OutputDebugString(buf);    // prints to the output window
}

Приведенный выше код в основном не проверен, но он должен объяснить концепцию.

Если вы не делаете это в C/C++, то этот метод не будет работать для вас.:-)

Вы должны быть в состоянии захватить вывод в текстовом файле и использовать его.

У меня нет под рукой VS, так что это из памяти:

  1. Создать проект C++
  2. Откройте настройки проекта, вкладку отладки
  3. Включить управляемую отладку
  4. Изменить командную строку, чтобы добавить "> output.txt"
  5. Запустите вашу программу под отладчиком

Если все работает так, как я помню, это перенаправит STDOUT в файл, даже если вы на самом деле не используете CMD.EXE.

(Отладчик имеет собственную реализацию синтаксиса перенаправления, которая не на 100% совпадает с cmd, но довольно хороша.)

Теперь, если вы откроете этот файл в VS, вы все равно сможете увидеть вывод изнутри VS, хотя и не в том же окне, на которое надеялись.

Консоль может перенаправить вывод на любой текстовый редактор. Если вы реализуете текстовый редактор, который пишет в Diagnostics.Debug, у вас все настроено.

Вот автор текста, который пишет в отладчик.

using System.Diagnostics;
using System.IO;
using System.Text;

namespace TestConsole
{
    public class DebugTextWriter : TextWriter
    {
        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void Write(string value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            Debug.WriteLine(value);
        }
    }
}

Так как он использует Diagnostics.Debug, он будет придерживаться настроек вашего компилятора, чтобы записывать какие-либо выходные данные или нет. Этот вывод также можно увидеть в Sysinternals DebugView.

Вот как вы используете это:

using System;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetOut(new DebugTextWriter());
            Console.WriteLine("This text goes to the Visual Studio output window.");
        }
    }
}

Если вы хотите увидеть выходные данные в Sysinternals DebugView при компиляции в режиме Release, вы можете использовать TextWriter, который пишет в API OutputDebugString. Это может выглядеть так:

using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace TestConsole
{
    public class OutputDebugStringTextWriter : TextWriter
    {
        [DllImport("kernel32.dll")]
        static extern void OutputDebugString(string lpOutputString);

        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            OutputDebugString(value.ToString());
        }

        //Added for efficiency
        public override void Write(string value)
        {
            OutputDebugString(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            OutputDebugString(value);
        }
    }
}

Может быть, это будет работать для вас: установите точку останова на закрытии } в Main, а затем посмотрите на окно консоли, прежде чем оно закроется. Вы даже можете скопировать текст из него, если вам нужно.

На каждой машине, которую я использую для разработки, я настраиваю свое окно консоли определенным образом, что делает этот подход более эффективным:

  1. Запустите cmd.exe
  2. ALT-SPACE, Д
  3. В меню "Параметры" включите режим QuickEdit.
  4. В Layout установите Buffer Height на 9999
  5. Нажмите ОК
  6. Выйдите из окна CMD.

Вы можете использовать класс Systems.Diagnostics.Trace, чтобы записать свой вывод в окно вывода вместо (или в дополнение к) консоли. Это займет немного конфигурации, но это работает. Это то, что вы хотите?

Вы также можете добавить свою вкладку в этой статье, но я никогда не пробовал.

System.Diagnostics.Debug.Writeline() или Trace.Writeline()

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