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

Вывод консоли консоли для отладки в VS?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

  • вызов printf и печать строки
  • вызов 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/С++, этот метод не будет работать для вас.:-)

Ответ 2

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

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

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

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

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

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

Ответ 3

Консоль может перенаправить ее на любой текстовый редактор. Если вы реализуете текстовый редактор, который записывает в 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 при компиляции в режиме выпуска, вы можете использовать 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);
        }
    }
}

Ответ 4

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

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

  • Запустите cmd.exe
  • ALT-SPACE, D
  • В "Параметры" включите режим QuickEdit.
  • В макете установите высоту буфера 9999
  • Нажмите "ОК"
  • Выход из окна CMD.

Ответ 5

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

Ответ 6

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

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