2010-12-15 7 views
7

Existe-t-il un moyen d'interrompre une session de débogage VS lors de la lecture ou de l'écriture d'un fichier spécifique?Points d'arrêt Visual Studio - interrompre l'accès à un fichier spécifique

Dans ce cas, je voudrais l'utiliser comme un outil exploratoire - supposons que je ne sais pas où dans un grand codebase on accède à ce fichier, ou où le nom de fichier est défini - il pourrait être ramassé de profond dans une config à grande échelle.

Répondre

3

Ce que je ferais est simplement pirater rapidement une classe statique qui utilise le FileSystemWatcher class écouter fichier créer/modifier des événements, et de mettre un point d'arrêt dans le rappel d'un événement, ou appelez le System.Diagnostics.Debugger.Break. Ensuite, quand il casse, passez à la fenêtre Threads et essayez de localiser le thread et le morceau de code qui a fait l'accès réel au fichier.

Si vous avez besoin de beaucoup utiliser cette classe, demandez à cette classe de conserver une liste de noms de fichiers spécifiques que vous voulez interrompre et d'exposer deux méthodes statiques publiques: Démarrer et arrêter l'écoute des modifications dans un fichier spécifique. En outre, si vous avez VS2010 Ultimate, vous pouvez simplement effectuer une recherche dans la liste des événements File Created dans le journal des événements IntelliTrace.

+0

Je ne l'ai pas essayé, mais c'est très probablement un génie. Je pensais à FileSystemWatcher hier, souhaitant qu'il y ait un moyen de l'accrocher. Bonne idée, va essayer. –

0

Vous pouvez définir un point d'arrêt conditionnel.

Supposons que vous ayez une variable de chaîne strFileName où le nom de fichier est stocké.

Sur la ligne où le fichier est lu, définissez un point d'arrêt. Faites un clic droit sur le point d'arrêt et cliquez sur "Condition ...".

Dans la boîte de dialogue do:

strFileName = "TheSpecificFileName.txt" 

qui ferait le travail si le nom de fichier est disponible qui est en cours de lecture.

+1

Merci - mais je suis en supposant que je ne sais pas où dans une grande base de code ce fichier est accessible à partir, ou où le nom de fichier est en train d'être défini - il peut être ramassé à partir de profondeur dans une configuration à grande échelle. –

1

Actuellement, mon processus doit être:

  • Rechercher dans les fichiers du nom de fichier ou un nom de fichier partiel
  • Rechercher dans les fichiers de configuration pour le nom de fichier ou un nom de fichier partiel
  • Devinez à objet de nom de fichier ou contenu, de trouver l'objet dans codebase, briser sur les entrées de méthode
  • (si xml, briser le ReadXml pour savoir où ouvrir ...)

qui est maladroit, mais fonctionne ...

3

Si vous êtes intéressé par n'importe quel l'accès au fichier, plutôt que d'y écrire, FileSystemWatcher n'aidera pas.

Une solution simple consiste à ouvrir le fichier à l'avance et à attendre que l'autre logique y accède, ce qui déclenche un IOException. Vous pouvez utiliser la classe d'aide suivante pour rompre immédiatement - ou la fonction « Exception Première chance » VS:

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

static class DebugHelper 
{ 
    public static void BreakOnFileAccess(string path) 
    { 
     var msg = Path.GetFullPath(path); 
     msg = "The process cannot access the file '" + msg; 
     msg = msg.ToUpper(); 

     var fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); 
     new Thread(() => { 
      while (true) 
      { 
       Thread.Sleep(Timeout.Infinite); 
       // ensure FileStream isn't GC'd as a local variable after its last usage 
       GC.KeepAlive(fs); 
      } 
     }).Start(); 

     AppDomain.CurrentDomain.FirstChanceException += (sender, e) => { 
      if (e.Exception is IOException && 
       e.Exception.Message.ToUpper().Contains(msg)) 
      { 
       Debugger.Break(); 
      } 
     }; 
    } 
} 
+0

Merci, surtout pour avoir ramassé si longtemps après que la question ait été posée. Pourquoi le GC.KeepAlive? Est-ce que le fait d'avoir une poignée fs statique ou une liste de poignées aurait le même effet? –

+1

L'appel KeepAlive est de s'assurer que le FileStream n'est pas GC'd, car les variables locales ne sont pas garanties de rester en vie après leur dernière utilisation dans la méthode. Oui, garder une référence dans un champ ou une collection statique serait tout aussi bien :-) – staafl

Questions connexes