2008-09-23 4 views
11

En la configuración de herramientas externas de VS hay una casilla de verificación "Usar ventana de salida" que captura la salida de línea de comandos de herramientas y la descarga a una pestaña VS.¿Resultado de la captura de la consola para la depuración en VS?

La pregunta es: ¿Puedo obtener el mismo procesamiento para mi programa cuando presiono F5?

Editar: Fwiw estoy en C#, pero si eso hace la diferencia en su respuesta, entonces es poco probable que su respuesta es lo que estoy buscando.

Lo que deseo tomaría el flujo de salida del programa y lo transferiría a la pestaña de salida en VS utilizando los mismos dispositivos que utiliza la redirección de salida ('|' y '>') en el indicador cmd.

Respuesta

1

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 ello. Una cosa que usted podría hacer sin embargo sería la de dirigir la función printf llama a su propia rutina que será

  1. llamada printf e imprimir la cadena
  2. OuputDebugString llamada() para imprimir la cadena a la ventana de salida

Puede hacer varias cosas para lograr este objetivo. En primer lugar sería para escribir su propia función printf y luego llamar a printf y el 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 es en su mayoría no probado, pero debe obtener a través de los conceptos.

Si no está haciendo esto en C/C++, este método no funcionará para usted. :-)

+0

C# lo siento, pero por lo demás es una buena idea. – BCS

+0

, el párrafo 2 parece cubrir este – BCS

+0

http: // stackoverflow.com/questions/587767/how-to-output-to-console-in-c-windows parece describir cómo hacer que funcione, aunque usar OutputDebugString también funciona bien. – rogerdpack

0

System.Diagnostics.Debug.Writeline() o Trace.Writeline()

+1

Estoy buscando algo que funcione sin modificar el código que está haciendo la salida. – BCS

0

Puede utilizar la clase Systems.Diagnostics.Trace para escribir su salida a la ventana de salida 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 por this article, pero nunca lo he intentado.

+0

Ese enlace tampoco lo es. Migas – BCS

3

Debería poder capturar el resultado en un archivo de texto y usarlo.

no tengo un VS a mano, así que esto es de la memoria:

  1. Crear un proyecto de C++
  2. Abrir la configuración del proyecto, ficha de depuración
  3. habilitar la depuración de comandos logrado
  4. Editar la línea para añadir "> output.txt"
  5. ejecutar el programa en el depurador

Si las cosas funcionan de la manera que recuerdo, esto redirigirá STDOUT a un archivo, incluso si no se está ejecutando bajo CMD.EXE.

(El depurador tiene su propia implementación de la sintaxis de redirección, que no es 100% igual que cmd, pero es bastante bueno.)

Ahora, si se abre este archivo en VS, todavía se puede ver el salida desde VS, aunque no exactamente en la misma ventana que estaba esperando.

1

Quizás esto funcione para usted: establezca un punto de interrupción en el 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 utilizo para el desarrollo, configurar mi ventana de la consola, en cierto modo, lo que sucede para que este enfoque funcione mejor:

  1. Ejecutar cmd.exe
  2. ALT-SPACE, D
  3. En Opciones, habilite el modo QuickEdit.
  4. en la disposición, juego de tampones Altura 9999
  5. Haga clic en OK
  6. Salir de la ventana de CMD.
+0

+1 para la configuración de la ventana de la consola. Agregaría la configuración de Altura del tamaño de ventana a 50. – AMissico

3

La consola puede redirigir su salida a cualquier máquina de escribir. Si implementa una máquina de escribir que escribe en Diagnostics.Debug, ya está todo listo.

Aquí hay un escritor de texto 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); 
     } 
    } 
} 

Dado que se usa Diagnostics.Debug se adherirá a la configuración del compilador de carnero se debe escribir cualquier salida o no. Este resultado también se puede ver en Sysinternals DebugView.

Así es como usted lo utiliza:

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 quieres ver la salida de Sysinternals DebugView cuando se compila en modo de lanzamiento, se puede utilizar un TextWriter que escribe en la API OutputDebugString. 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); 
     } 
    } 
} 
+0

Muy bonito. Yo podría aceptar dos respuestas. – BCS

Cuestiones relacionadas