Domanda

Oggi mi sono imbattuto in un problema fosse avevo bisogno di remote-debug di un programma. Il programma è stato lanciato da un altro sistema, in modo davvero non hanno la possibilità di interagire con essa sulla riga di comando. Ho potuto cambiare la sua fonte facilmente però.

Quello che mi serviva per accadere era per il programma per avviare normalmente, e quindi attendere per me da allegare ad essa con un debugger. Non riuscivo a trovare un modo per farlo che mi ha reso felice. Ho trovato il bug, ma senza l'aiuto del debugger.

while(true) { }

Mantenuto il processo vivo, e quindi ho potuto "Imposta istruzione successiva" con il debugger, ma sembrava goffo e maleducato.

Console.ReadLine();

sembrava strano di digitare dal momento che non c'era in realtà una console per me di premi Invio a. (Non ha funzionato, neanche. Imposta istruzione successiva e poi corsa vi porta indietro nel ReadLine () aspettare.)

Quindi, che tipo di codice che può inserire in un .NET / CLR programma / C # che dice "aspetta qui fino a quando posso collegare con un debugger"?

È stato utile?

Soluzione

È possibile utilizzare il System.Diagnostics.Debugger. IsAttached struttura per controllare se un debugger è collegato al processo. Questa applicazione attenderà fino a quando un debugger è stato allegato:

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");
        }
    }
}

Altri suggerimenti

Questo suona come esattamente quello che vi serve:

Debugger.Launch();

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

"lancia e attribuisce un debugger al processo".

Non lo so, perché non ho mai provato, ma mi chiedo se si potrebbe usare System.Diagnostics.Debugger.Break() al fine di avere un punto di interruzione ha colpito e poi aspettare per un debugger di allegare. Ho assumere un debugger remoto avrebbe funzionato, ma non so di sicuro e attualmente non hanno accesso al mio ambiente domestico in cui ho potuto facilmente deridere su e prova la mia teoria. C'è un MSDN articolo parlando di usarlo in un'applicazione ASP.Net quindi immagino che avrebbe funzionato.

Collegamento debugger remoto funziona esattamente lo stesso che usare debugger locale.

In primo luogo, fare la solita:

System.Diagnostics.Debugger.Launch();

Si vedrà un prompt di scegliere debugger. A questo punto l'esecuzione è sospesa, in modo in modo da poter collegare debugger remoto e selezionare "No" dal prompt.

Debug.Assert(true);

dovrebbe funzionare anche immagino. Tra l'altro, ho anche affrontato questo problema a volte e fare

MessageBox.Show() 

: P: P

Imposta un timeout che si dà il tempo di connettere il debugger.

Thread.Sleep(30000);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top