Вывод консоли консоли для отладки в VS?
В настройках внешних инструментов VS есть флажок "Использовать окно вывода", который захватывает вывод командной строки инструментов и выгружает его на вкладку VS.
Вопрос: могу ли я получить ту же самую обработку для своей программы, когда я нажму F5?
Изменить: FWIW Я нахожусь на С#, но если это имеет значение для вашего ответа, вряд ли ваш ответ будет тем, что я ищу.
То, что я хочу, будет принимать выходной поток программы и переносить его на вкладку вывода в VS с использованием тех же устройств, которые перенаправляют вывод ('|' и ' > ') в командной строке.
Ответы
Ответ 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 для записи вывода в окно вывода вместо (или в дополнение к) консоли. Он требует небольшой конфигурации, но он работает. Это то, что вам нужно?
Вы также можете добавить свою собственную вкладку в в эту статью, но я никогда не пробовал ее.