Захватить консольный вывод для отладки в VS? - PullRequest
11 голосов
/ 23 сентября 2008

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 07 апреля 2011

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

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

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

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

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

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

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

1 голос
/ 24 сентября 2008

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

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

  1. Запустить cmd.exe
  2. ALT-SPACE, D
  3. В настройках включите режим QuickEdit.
  4. В макете установите для высоты буфера значение 9999
  5. Нажмите ОК
  6. Выход из окна CMD.
1 голос
/ 23 сентября 2008

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

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

0 голосов
/ 23 сентября 2008

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

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

0 голосов
/ 23 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...