web-dev-qa-db-fra.com

Utiliser une console personnalisée pour le débogage des applications de la console Visual Studio

Est-il possible de configurer Visual Studio pour utiliser une console non standard lors du débogage d'une application console?

Je ne suis pas sûr de la console par défaut, elle ressemble à cmd.exe. J'aimerais vraiment que mon application console s'exécute dans ConEmu lorsque je débogue.

Pour être clair, je veux cliquer sur "Démarrer le débogage" et le processus devrait se dérouler exactement comme d'habitude, mais au lieu de faire apparaître un cmd.exe console, il devrait faire apparaître une console ConEmu (ou autre).

J'utilise Visual Studio 2010 Pro

Étroitement lié à cette question (sans réponse): tiliser Console2 pour le débogage de Visual Studio?

45
Pieter Müller

Vous avez confondu les termes. La "console Windows" n'est pas un "cmd.exe", mais un "service" spécial qui a implémenté, par exemple de Win7, avec "conhost.exe".

Lorsque vous démarrez toute application de console (peu importe cmd, powershell ou votre propre application) Windows la démarre dans un environnement spécial, qui peut avoir une fenêtre de console visible . Mais c'est toujours une console Windows interne.

Mais! Les émulateurs de console peuvent saisir cette fenêtre, masquer la vraie console et afficher leur propre surface émulée. Par exemple, vous pouvez démarrer ConEmu avec des commutateurs spéciaux (décrits sur SU, lien en commentaire) et c'est fait.

Remplacement du terminal par défaut

ConEmu a une fonctionnalité nommée Default Terminal. Si vous activez cette fonctionnalité, le démarrage de votre application à partir de Visual Studio dans le terminal ConEmu sera fluide. L'idée consiste à accrocher CreateProcess dans l'application source (Explorer.exe, vcexpress.exe et ainsi de suite, délimitez-les avec | dans les paramètres). En savoir plus sur cette fonctionnalité dans le wiki du projet .

Vous pouvez choisir d'utiliser une instance ConEmu existante ou d'exécuter une nouvelle fenêtre pour votre application. Et ConEmu peut afficher Press Enter or Esc to close console... message sur la console après la fermeture de votre application (la radio Always). Plus besoin d'ajouter readline à la fin de votre programme pour voir la sortie.

ConEmu DefTerm settings page

Modification de votre code d'application

Puisqu'il s'agit de votre propre programme, vous pouvez ajouter, par exemple, les lignes suivantes à la tête de votre fonction main

Exemple C++

#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

Exemple 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
39
Maximus

Quelques idées:

  1. Démarrez simplement votre programme directement dans ConEmu, puis choisissez Attacher au processus dans le menu Déboguer de Visual Studio. Vous pouvez ajouter un délai au début de votre programme pour vous donner le temps de vous attacher. C'est une sorte de douleur si vous devez le faire encore et encore, mais c'est souvent utile pour ce type de situation.

  2. Ajoutez une instruction __debugbreak(); au début de votre programme (peut-être à l'intérieur d'une #ifndef NDEBUG bloquer). Démarrez votre programme directement depuis ConEmu. Utilisez la fonctionnalité JIT de Visual Studio pour vous connecter lorsque la pause de débogage se produit et continuer le débogage à partir de là.

3
Adrian McCarthy