Захватить консольный вывод для отладки в VS?
В настройках внешних инструментов VS есть флажок "Использовать окно вывода", который фиксирует вывод командной строки инструментов и выводит его на вкладку VS.
Вопрос: могу ли я получить ту же обработку для моей программы, когда я нажму F5?
Изменить: FWIW Я в C#, но если это имеет значение для вашего ответа, то вряд ли ваш ответ - то, что я ищу.
Я хотел бы взять поток вывода программы и перенести его на вкладку вывода в VS, используя те же устройства, которые использует перенаправление вывода ('|' и '>') в командной строке cmd.
6 ответов
Я собираюсь сделать несколько предположений здесь. Во-первых, я предполагаю, что вы говорите о выводе printf из приложения (будь то из приложения консоли или из приложения с графическим интерфейсом Windows). Мое второе предположение - язык Си.
Насколько мне известно, вы не можете направить вывод 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/C++, то этот метод не будет работать для вас.:-)
Вы должны быть в состоянии захватить вывод в текстовом файле и использовать его.
У меня нет под рукой VS, так что это из памяти:
- Создать проект C++
- Откройте настройки проекта, вкладку отладки
- Включить управляемую отладку
- Изменить командную строку, чтобы добавить "
> output.txt
" - Запустите вашу программу под отладчиком
Если все работает так, как я помню, это перенаправит 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
, а затем посмотрите на окно консоли, прежде чем оно закроется. Вы даже можете скопировать текст из него, если вам нужно.
На каждой машине, которую я использую для разработки, я настраиваю свое окно консоли определенным образом, что делает этот подход более эффективным:
- Запустите cmd.exe
- ALT-SPACE, Д
- В меню "Параметры" включите режим QuickEdit.
- В Layout установите Buffer Height на 9999
- Нажмите ОК
- Выйдите из окна CMD.
Вы можете использовать класс Systems.Diagnostics.Trace, чтобы записать свой вывод в окно вывода вместо (или в дополнение к) консоли. Это займет немного конфигурации, но это работает. Это то, что вы хотите?
Вы также можете добавить свою вкладку в этой статье, но я никогда не пробовал.