c# - una - la aplicacion se encuentra en modo de interrupcion visual studio 2017
Capturar salida de consola para la depuración en VS? (6)
En la configuración de herramientas externas de VS hay una casilla de verificación "Usar ventana de salida" que captura la salida de la línea de comandos de herramientas y la descarga a una pestaña VS.
La pregunta es: ¿puedo obtener el mismo procesamiento para mi programa cuando presiono F5?
Edit: FWIW Estoy en C # pero si eso hace una diferencia en tu respuesta, entonces es poco probable que tu respuesta sea lo que estoy buscando.
Lo que quisiera sería tomar la secuencia de salida del programa y transferirla a la pestaña de salida en VS usando los mismos dispositivos que utiliza la redirección de salida (''|'' y ''>'') en el indicador de comando cmd.
Puede usar la clase Systems.Diagnostics.Trace para escribir su salida en la ventana de resultados en lugar de (o además de) la consola. Toma una pequeña configuración, pero funciona. ¿Es eso lo que quieres?
También puede agregar su propia pestaña según este artículo , pero nunca lo intenté.
System.Diagnostics.Debug.Writeline () o Trace.Writeline ()
Debería poder capturar el resultado en un archivo de texto y usarlo.
No tengo un VS práctico, así que esto es de memoria:
- Crear un proyecto de C ++
- Abra la configuración del proyecto, pestaña de depuración
- Habilitar la depuración administrada
- Edite la línea de comando para agregar "
> output.txt
" - Ejecute su programa bajo el depurador
Si las cosas funcionan de la manera que recuerdo, esto redireccionará STDOUT a un archivo, aunque en realidad no se esté ejecutando bajo CMD.EXE.
(El depurador tiene su propia implementación de sintaxis de redirección, que no es 100% igual que cmd, pero es bastante buena).
Ahora, si abre este archivo en VS, aún puede ver el resultado desde VS, aunque no exactamente en la misma ventana que estaba esperando.
Tal vez esto funcione para usted: establezca un punto de interrupción al cierre }
en Main
, y luego mire la ventana de la consola antes de que se cierre. Incluso puede copiar el texto si lo necesita.
En cada máquina que uso para el desarrollo, configuro la ventana de mi consola de cierta manera, lo que hace que este enfoque funcione mejor:
- Ejecute cmd.exe
- ALT-SPACE, D
- En Opciones, habilite el modo QuickEdit.
- En Diseño, establezca la Altura del búfer en 9999
- Haga clic en Aceptar
- Salga de la ventana de CMD.
Voy a hacer algunas suposiciones aquí. En primer lugar, supongo que está hablando de salida de impresión desde una aplicación (ya sea desde una aplicación de consola o desde una aplicación de Windows GUI). Mi segunda suposición es el lenguaje C.
Que yo sepa, no se puede dirigir la salida de impresión a la ventana de salida en el estudio de desarrollo, no directamente de todos modos. [énfasis agregado por OP]
Puede haber una manera, pero no soy consciente de eso. Sin embargo, una cosa que podría hacer sería dirigir las llamadas a funciones de impresión a su propia rutina que
- llame a printf e imprima la cadena
- llamar a OuputDebugString () para imprimir la cadena a la ventana de salida
Podría hacer varias cosas para lograr este objetivo. Primero sería escribir su propia función printf y luego llamar a printf y 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
}
El código anterior no se ha probado en su mayoría, pero debe transmitir los conceptos.
Si no está haciendo esto en C / C ++, entonces este método no funcionará para usted. :-)
La consola puede redirigir su salida a cualquier editor de textos. Si implementa una máquina de escribir que escribe en Diagnostics.Debug, ya está todo listo.
Aquí hay un escritor de textos que escribe en el depurador.
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);
}
}
}
Como utiliza Diagnostics.Debug, se ajustará a la configuración del compilador para saber si debe escribir alguna salida o no. Este resultado también se puede ver en Sysinternals DebugView.
Así es como lo usa:
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.");
}
}
}
Si desea ver el resultado en Sysinternals DebugView cuando está compilando en modo Release, puede usar un TextWriter que escribe en OutputDebugString API. Podría verse así:
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);
}
}
}