2012-09-26 17 views
39

¿Es posible configurar Visual Studio para utilizar una consola no estándar al depurar una aplicación de consola?Usar una consola personalizada para la depuración de aplicaciones de Visual Studio Console

No estoy seguro de cuál es la consola predeterminada, se parece a cmd.exe. Realmente me encantaría que mi aplicación de consola se ejecute en ConEmu cuando depuro.

Para ser claro, quiero hacer clic en "Iniciar depuración" y el proceso debería realizarse exactamente como siempre, pero en lugar de abrir una consola cmd.exe, debería aparecer una consola ConEmu (o lo que sea).

Estoy usando Visual Studio 2010 Pro

En estrecha relación con esta cuestión (sin respuesta): Use Console2 for Visual Studio debugging?

+1

Q similares en superusuario http://superuser.com/q/445394/139371 – Maximus

+0

Los métodos dados en respuesta a continuación funcionan bien, sin embargo, deseo Visual Studio se había incorporado en el apoyo a la elección de una tercera parte de la consola Emulador para mostrar toda la salida de la aplicación de consola. (Todavía no estoy seguro si estoy obteniendo mi terminología aquí, @Maximus! :-)) –

+0

sí, ConEmu ... – Anubis

Respuesta

34

Has mezclar hasta términos. La "Consola de Windows" no es un "cmd.exe", sino un "servicio" especial que se implementó, por ejemplo de Win7, con "conhost.exe".

Al iniciar cualquier aplicación de consola (no importa cmd, powershell o su propia aplicación) Windows la inicia en un entorno especial, que puede tener una ventana de consola visible. Pero siempre es una consola interna de Windows.

¡Pero! Los emuladores de consola pueden tomar esta ventana, ocultar una consola real y mostrar su propia superficie emulada. Por ejemplo, puede iniciar ConEmu con modificadores especiales (descritos en SU, enlace en comentario) y listo.

reemplazo de terminal por defecto

ConEmu tiene una característica denominada Default Terminal. Si habilita esta función obtendrá una aplicación sin problemas desde Visual Studio en la terminal ConEmu. La idea es conectar CreateProcess en la aplicación de origen (explorer.exe, vcexpress.exe y así sucesivamente, delimítelos con | en la configuración). Lea más sobre esa función en el project wiki.

Puede optar por utilizar una instancia existente de ConEmu o ejecutar una nueva ventana para su aplicación. Y ConEmu puede mostrar el mensaje Press Enter or Esc to close console... en la consola después de que se cierre la aplicación (la radio Always). Ya no es necesario agregar readline al final de su programa para ver la salida.

ConEmu DefTerm settings page

Cambio de código de aplicación

Debido a que es su propio programa, es posible añadir, por ejemplo, las siguientes líneas a la cabeza de su función main

C++ ejemplo

#ifdef _DEBUG 
if (IsDebuggerPresent()) 
{ 
    STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {}; 
    if (CreateProcess(NULL, 
     _T("\"C:\\Program Files\\ConEmu\\ConEmu\\ConEmuC.exe\" /AUTOATTACH"), 
     NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) 
    { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } 
} 
#endif 

ejemplo de C#

#if DEBUG 
ProcessStartInfo pi = new ProcessStartInfo(@"C:\Program Files\ConEmu\ConEmu\ConEmuC.exe", "/AUTOATTACH"); 
pi.CreateNoWindow = false; 
pi.UseShellExecute = false; 
Console.WriteLine("Press Enter after attach succeeded"); 
Process.Start(pi); 
Console.ReadLine(); 
#endif 
+0

Gracias. La opción 'Adjuntar a' en ConEmu funciona muy bien, como se describe en el enlace del artículo SuperUser que ha comentado en mi publicación. No he podido probar la directiva de preprocesador que proporciona aquí, ya que estoy trabajando en C# y actualmente no sé cómo implementar la directiva que proporcionó para el preprocesador de C#. Gracias por una excelente aplicación! –

+0

C# code example ... – Maximus

+0

Gracias @Maximus. ¿Cuál es el comportamiento esperado del interruptor AUTOATTACH en este escenario? –

3

Algunas ideas:

  1. Basta con iniciar su programa en ConEmu directamente, a continuación, seleccione Asociar al proceso en el menú Depurar en Visual Studio. Puede agregar un retraso al comienzo de su programa para darle tiempo para adjuntarlo. Esto es un poco doloroso si tienes que hacer esto una y otra vez, pero a menudo es útil para este tipo de situaciones.

  2. Agregue una declaración __debugbreak(); al comienzo de su programa (quizás dentro de un bloque #ifndef NDEBUG). Comience su programa directamente desde ConEmu. Utilice la función JIT de Visual Studio para conectarse cuando se produce el error de depuración y continúe depurando desde allí.

Cuestiones relacionadas