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!
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