2010-06-01 7 views
4

Je suis en train d'écrire un complément Visual Studio en C# qui sera exécuté pendant que je débogue un processus dans la même fenêtre Visual Studio et que j'ai besoin d'accéder à la trace de la pile du processus depuis mon add-in. J'ai essayé de mettre ce code dans mon add-in mais il retourne la trace de la pile du complément, pas le processus que je débogue.Comment faire pour obtenir la trace de pile d'un processus en cours à partir d'un complément Visual Studio?

System.Diagnostics.StackTrace piletrace = new System.Diagnostics.StackTrace (true); System.Diagnostics.StackFrame stackframe = piletrace.GetFrame (0);

Toute aide serait appréciée.

Répondre

-1

Le code fonctionne comme prévu puisque lorsque vous appelez le code, votre complément (sous VS) est le "processus en cours". Je ne suis pas sûr de ce que vous entendez par "processus en cours d'exécution" (voulez-vous dire le processus en cours d'exécution/débogué sous VS?), Mais je ne pense pas qu'il soit possible d'obtenir une trace d'un autre processus.

+0

Oui J'ai le complément dans Visual Studio pendant que je débogue un processus dans la même fenêtre Visual Studio et j'ai besoin d'accéder à la trace de pile de ce processus à l'intérieur de mon complément. – Jack

4

La méthode la plus simple consiste à demander au débogueur les trames de la pile via l'objet automation DTE. L'objet DTE doit être disponible via votre complément. La propriété que vous souhaitez est Debugger.CurrentThread.StackFrames. Si vous utilisez .NET 4, vous pouvez le faire:

static string GetCurrentStackTrace(DTE dte) 
    { 
     bool canGetStackTrace = 
      (dte != null) && 
      (dte.Debugger != null) && 
      (dte.Debugger.CurrentThread != null) && 
      (dte.Debugger.CurrentThread.StackFrames != null); 

     if (!canGetStackTrace) 
      return string.Empty; 

     return string.Join(
      "\n", 
      dte.Debugger.CurrentThread.StackFrames.Cast<StackFrame>().Select(f => f.FunctionName) 
     ); 
    } 

Sinon, vous pouvez faire:

static string GetCurrentStackTrace(DTE dte) 
    { 
     bool canGetStackTrace = 
      (dte != null) && 
      (dte.Debugger != null) && 
      (dte.Debugger.CurrentThread != null) && 
      (dte.Debugger.CurrentThread.StackFrames != null); 

     if (!canGetStackTrace) 
      return string.Empty; 

     StringBuilder stackTrace = new StringBuilder(); 

     foreach (StackFrame frame in dte.Debugger.CurrentThread.StackFrames) 
     { 
      stackTrace.AppendFormat("{0}\n", frame.FunctionName); 
     } 

     return stackTrace.ToString(); 
    } 

La façon douloureuse et impliqué serait d'utiliser ICorDebug et StackWalk64 pour obtenir et natif réussi empile séparément puis les assembler à la main. Puisque vous êtes un add-in VS, vous pouvez aussi laisser le débogueur faire le gros du travail pour vous!

+0

Merci beaucoup pour la réponse! Je vais certainement essayer. – Jack

+0

Avez-vous une chance de savoir comment obtenir les numéros de ligne et/ou les signatures de fonction? – Earlz

+0

Nevermind, compris (mais ce n'est pas joli) voir http://stackoverflow.com/a/14251675/69742 – Earlz

Questions connexes