2009-10-12 23 views
20

Y a-t-il des bibliothèques intégrées ou de tierces parties qui vous permettent de vider simplement toutes les variables en mémoire pendant l'exécution? Ce que j'aimerais, c'est être capable de voir les variables & valeurs actuelles de manière similaire à les visualiser en frappant un point de rupture et planant sur des variables, mais sans avoir à arrêter l'exécution du programme (c'est-à-dire obtenir un instantané). Serait bien si elle pourrait les vider dans un fichier qui peut ensuite être ouvert plus tard dans un programme pour obtenir une interface graphique agréable pour les voir, mais un simple vidage de fichier texte serait assez bon.C# Comment vider toutes les variables et les valeurs actuelles pendant l'exécution

+0

Je pense que cette question est très générique, et ferait partie d'un "super-débogueur" si une réponse existait, donc j'ai ouvert une prime pour cela. Imaginez si la liste des variables était filtrable à la volée, et donnait aussi l'utilisation de la mémoire (on peut rêver). –

+0

"auto-débogueur"? –

+1

Non, je voulais dire 'super' parce que ce serait supérieur à ce que nous avons actuellement avec C#. –

Répondre

7

Je ne peux pas imaginer un moyen facile de le faire de manière générique. Ce qui pourrait fonctionner est la création par programme d'un fichier de vidage de votre processus en cours d'exécution. Vous pouvez soit faire cela avec P/Invoke pour les routines dbghelp.dll ou générer un processus cdb.exe pour créer le fichier de vidage. Une fois que vous avez le fichier, vous pouvez l'ouvrir dans un débogueur pour une analyse ultérieure en utilisant SOS.dll with cdb.exe/windbg.exe, ou même écrire un debugger script pour vider les données que vous voulez (la plupart du temps) automatiquement.

4

je crois une sorte de cadre de l'exploitation forestière pourrait vous aider à le faire ...

Départ:

http://www.dotnetlogging.com/

Au travail, nous utilisons log4net qui fonctionne assez bien pour nous.

Alors comment se fait-il que vous vouliez vider toutes les variables pour une analyse ultérieure? Avez-vous envisagé d'écrire votre test de code en premier afin que vous puissiez réduire votre dépendance sur le débogueur et avoir une suite de tests automatisés vérifiant les valeurs pour vous?

+0

Ouais, j'utilise déjà la journalisation similaire à log4net. Cependant, je voulais plus d'un vidage de variable générique afin que je n'aurais pas besoin d'écrire du code spécifique pour exporter des variables vers un enregistreur pour chaque programme. Il serait également intéressant d'avoir un visualiseur graphique d'un instantané de sorte que, pour les structures de classe complexes, il soit facile à lire. – mike

+0

Je veux jeter les variables pour la tranquillité d'esprit essentiellement. Je suis confiant dans le programme, mais je veux juste confirmer que tout va bien. Il est extrêmement difficile d'écrire des tests approfondis pour la nature du travail que je fais, et même alors, vous ne pouvez écrire des tests que pour des situations auxquelles vous pouvez penser. Il serait également capable de se former comme un niveau bas pour voir dans quel état se trouve le programme à tout moment. – mike

1

Dans le passé, j'ai utilisé le profileur YourKit .Net pour profiler les applications .Net.

Même si je ne l'ai utilisé que pour se connecter à des applications en cours d'exécution, le Snapshot documentation indique qu'il dispose d'un Profiler API qui peut être utilisé pour exporter des instantanés par programmation en vue d'une révision ultérieure.

code sage ce qui semble être aussi simple que:

Controller c = new Controller(); 
String snapshotPath = c.CaptureSnapshot(); 

Je crois que vous pouvez charger les fichiers de capture instantanée dans l'interface graphique YourKit à une date ultérieure pour les examiner.

Je ne serais pas surpris si certains des autres profileurs populaires comme JetBrains dotTrace Performance et Redgates ANTS Performance Profiler ont des APIs similaires, mais je ne pouvais pas trouver rapidement la documentation évidente sur leurs sites Web (et je ne voulais pas regarder leurs webinaires savoir si cette fonctionnalité existe!)

+1

Vous devriez peut-être mentionner que YourKit coûte de l'argent. WMemoryProfiler est gratuit et open source. J'ai également trouvé sur les pages Web de profileurs commerciaux, sauf pour Yourkit pas d'instantané de mémoire programme Api. Les autres ne disposent que d'Apis pour les instantanés de profileur de performance. Si cette fonctionnalité existait, je suis sûr que le marketing l'aurait mis sur leur page Web. –

0

Vous pouvez essayer l'outil Intellitrace fourni avec la version ultime de Visual Studio. C'est ce que vous décrivez - il enregistre ce qui se passe dans votre application et vous permet de le déboguer sans exécuter votre programme en survolant les variables et toutes les autres fenêtres de débogage pour vous aider.

0

Vous pouvez utiliser PostSharp. Je l'ai trouvé très utile pour enregistrer les temps de débogage à cause de l'application de l'environnement a été déployée. Et instrumenté/enregistré beaucoup de choses.

Mais évidemment, vous devrez spécifier toutes les variables que vous devez enregistrer. Voir plus de détails here.

1

Pour cela, vous pouvez utiliser WMemoryProfiler à

  • Obtenez tous les objets dans tous les domaines d'application comme un tableau d'objets
  • Créer une image mémoire de votre propre processus
  • Sérialise objets spécifiques à disque

Pour ce faire, vous avez besoin de Windbg bien sûr, mais l'API de WMemoryProfiler est entièrement géré et vous pouvez essentiellement déboguer votre processus. La bibliothèque prend soin des bizarreries habituelles du débogueur, car elle enveloppe Windbg dans une bibliothèque accessible.

Le code ci-dessous récupère toutes les instances d'objets System.Threading.Thread dans un tableau d'objets. De cette façon, vous pouvez écrire un visualiseur pour vos propres objets d'application lors de l'exécution. L'autre surcharge vous donne simplement tous les objets dans tous les AppDomains.

using (var debugger = new MdbEng()) 
{ 
    var dummy = new Thread(() => {}); 
    dummy.Name = "Dummy Thread"; 

    // Get all thread objects in all AppDomains 
    var threads = debugger.GetObjects("System.Threading.Thread", true); 

    foreach (Thread t in threads) 
    { 
    Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name); 
    } 
    GC.KeepAlive(dummy); 
} 

Comme il est un wrapper autour Windbg vous pouvez également créer une image mémoire à la volée, puis charger une sauvegarde de la mémoire de votre processus pour extraire des données d'objet pour la visualisation de la décharge. Les profileurs de mémoire Commerical (par exemple MemoryProfiler de Scitech) utilisent cette technique depuis des années mais il est assez lent quand vous avez un énorme vidage de mémoire car ils utilisent aussi Windbg comme analyseur de vidage.

Questions connexes