60 votes

Comment attendre que le débogueur .NET distant soit connecté ?

Aujourd'hui, j'ai rencontré un problème où je devais déboguer un programme à distance. Le programme a été lancé depuis un autre système, je n'ai donc pas vraiment la possibilité d'interagir avec lui sur la ligne de commande. Pourtant, je pourrais facilement modifier ses sources.

Ce dont j'avais besoin, c'était que le programme démarre normalement, puis attende que je m'y attache avec un débogueur. Je n'ai pas réussi à trouver un moyen de le faire qui me satisfasse. J'ai trouvé le bogue, mais sans l'aide du débogueur.

while(true) { }

Cela a permis de maintenir le processus en vie, et j'ai ensuite pu "définir l'instruction suivante" avec le débogueur, mais cela m'a semblé maladroit et impoli.

Console.ReadLine();

Il m'a semblé étrange de taper cette phrase puisqu'il n'y avait pas de console sur laquelle j'aurais pu appuyer. entrer au. (Cela n'a pas fonctionné non plus. Définir l'instruction suivante puis exécuter vous ramène à l'attente de ReadLine()).

Quel type de code puis-je insérer dans un programme .NET/CLR/C# qui dit "attendez ici jusqu'à ce que je puisse l'attacher avec un débogueur" ?

109voto

Daniel Richardson Points 2558

Vous pouvez utiliser le System.Diagnostics.Debugger.IsAttached pour vérifier si un débogueur est attaché au processus. Cette application attendra qu'un débogueur soit attaché :

using System;
using System.Diagnostics;
using System.Threading;

namespace DebugApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Waiting for debugger to attach");
            while (!Debugger.IsAttached)
            {
                Thread.Sleep(100);
            }
            Console.WriteLine("Debugger attached");
        }
    }
}

18voto

Martin Sherburn Points 1897

Cela semble être exactement ce dont vous avez besoin :

Debugger.Launch();

http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx

"Lance et attache un débogueur au processus".

6voto

Steven Behnke Points 2149

Je ne sais pas, car je n'ai jamais essayé, mais je me demande si l'on ne pourrait pas utiliser System.Diagnostics.Debugger.Break() afin qu'il atteigne un point d'arrêt et qu'il attende qu'un débogueur se connecte. Je suppose qu'un débogueur à distance fonctionnerait, mais je n'en suis pas sûr et je n'ai pas accès à mon environnement personnel où je pourrais facilement le simuler et tester ma théorie. Il existe un Article de MSDN Il est question de l'utiliser dans une application ASP.Net, j'imagine donc que cela fonctionnerait.

5voto

ya23 Points 6491

La connexion d'un débogueur à distance fonctionne exactement de la même manière que l'utilisation d'un débogueur local.

Tout d'abord, faites comme d'habitude :

System.Diagnostics.Debugger.Launch();

Vous verrez une invite à choisir le débogueur. À ce stade, l'exécution est suspendue, de sorte que vous pouvez attacher un débogueur à distance et sélectionner "Non" à l'invite.

1voto

Debug.Assert(true);

devrait également fonctionner. D'ailleurs, je suis également confronté à ce problème de temps en temps et je le fais.

MessageBox.Show() 

:P :P

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X