9
votes

C # Force Mode de débogage Programmatiquement

Nevermind pourquoi on pourrait vouloir faire cela, je suis juste curieux de savoir si cela peut être fait si cela peut être fait.

Voici mon code qui ne fonctionne pas: P>

if (!Debugger.IsAttached)
{
    try
    {
        Debugger.Launch();
        while (!Debugger.IsAttached)
        {
            Thread.Sleep(1000);
        }
    }
    catch (System.Security.SecurityException e)
    {
        Console.WriteLine("exception " + e.Message);
    }
}


4 commentaires

Votre question n'est pas claire. Pouvez-vous décrire plus en détail ce que vous cherchez à faire?


Mon objectif était de démarrer le débogueur programmatiquement, c'est-à-dire de l'attacher au processus qui fonctionne via le processus lui-même.


Cela a vraiment bien fonctionné pour moi. Je n'ai pas pu attacher un débogueur à un processus dès qu'il commence (même en utilisant gflags, vsjitdebugger et windbg). Cela n'a pas seulement lancé un débogueur vs pour moi, mais a également déclenché un point d'arrêt immédiat. Il a également trouvé des PDB que, pour une raison quelconque, on ne pouvait pas être trouvé lors de la fixation manuelle à un processus (même avec le jeu de chemins correct). Merci!


@Perryc, content que cela ait aidé. Comme suivez-le, en fonction de la mise en œuvre de cette option: Références. Microsoft.com/#mscorlib/system/diagnostics/.../a>, je pense qu'il n'était pas nécessaire de vérifier le débogueur.autachis, car il vérifie déjà que sous la hotte. Donc, un débogueur.Launch () appel devrait suffire à proximité du point d'entrée du programme, et les points d'arrêt suivants devraient être juste du débogger.Break ().


3 Réponses :


3
votes

Il lancera et attachera un débogueur au processus. Pour sûr, ne l'utilisez pas dans la production. Je pense que cette utilisation possible Peut être dans la machine locale lorsque l'erreur s'est produite et que vous souhaitez exécuter automatiquement le débogage.


2 commentaires

Merci pour votre conseil, mais je pense que ce n'est pas en fait attacher à mon processus. C'est peut-être parce que j'utilise Visual Studio Express.


VS Express n'inclut pas le débogueur JIT.



3
votes

Je pense que vous êtes mal compris ce que débogger.launch () fait. Il fonctionne comme un point d'arrêt codé dur.

Lorsque votre programme frappe débogger.launch () , la fenêtre de débogage juste à temps affichera (en supposant que vous avez installé Visual Studio sur la machine. À ce stade, votre programme est arrêté. - ça ne continue pas à courir.

Si vous choisissez une instance de VS, elle sera lancée et sera arrêtée sur la ligne avec débogger.launch () , comme si vous frappez un point d'arrêt.

Donc, il n'y a vraiment aucune raison pour la boucle tandis que (). Vous pouvez simplement appeler débogger.launch () quand vous voulez arrêter le programme pour regarder quelque chose.

mais l'utilité de débogger.launch () est discutable. Vous pouvez également utiliser des points d'arrêt beaucoup plus facilement et avec des points d'arrêt, il n'ya aucun danger de le laisser accidentellement dans le produit fini.


5 commentaires

De MSDN sur débogger.Launch () - "lance et attache un débogueur au processus". Peut-être que vous pensez débogueur.breake ()? Je pense que Simon Mourier me sauvera sur cela, sur la base de sa réponse.


@ user420667: Nope - Je n'ai pas lu les documents. J'ai codé une application rapide d'une ligne pour le tester. Si vous l'exécutez sous VS, cela se comporte exactement comme un point d'arrêt. Mais si vous lancez en dehors de VS, cela se comporte exactement comment je l'ai décrit. Il est possible que nos machines se comportent différemment en fonction des différents composants VS installés ou de ce que ce sont les résultats que j'ai reçus.


C'est étrange, lorsque je l'exécute dans VS 2008 Express et VS 2008, il ne forte pas de stop (lors du démarrage du mode de débogage ou du mode non débogé). Seul du débogueur.Break () oblige un arrêt lorsque je l'exécute, et c'est quand c'est en mode de débogage. Quand je l'exécute dans vs 2008, débogger.launch () Invite une exception et demande à lancer un débogueur.


Cela fonctionne pour moi avec vs2008. J'ai même compilé le code en dehors de VS (en utilisant csc.exe) car j'ai un tas de petits scripts de test. Je ne veux pas avoir à avoir un projet séparé pour chaque script de test, mais je veux déboguer dans VS si quelque chose ne va pas. Je viens de mettre le débogger.launch () dans le code qui ne fonctionne pas et il apparaît dans vs.


Je connais ce vieux mais je voulais juste commenter. Ceci est utile dans le démarrage de service pour ne pas mettre les attentes dans votre code afin que vous puissiez attacher un débogueur. Normalement, cela repose juste dans notre code jusqu'à ce que nous souhaitions déboguer de cette section et non de la course à la joindre au démarrage du service. Cela fonctionne également bien pour les applications MVC pendant qu'ils démarrent parce que mes points de pause ne sont pas touchés qu'après le démarrage.



17
votes

3 commentaires

Cool, je vais devoir faire un bon avis sur cet article. Je me rends compte que cela puisque j'utilise VS Express, qui ne dispose pas normalement d'une commande "attachée à traiter" comme les autres studios Visual, que cela ne soit peut-être pas destiné à travailler pour moi.


Malheureusement, le lien ne donne pas tout à fait ce que je cherchais, mais c'est une astuce soignée qui peut être utile.


@Student - Merci d'avoir remarqué. J'ai mis à jour le lien.