Самый простой способ - запросить у отладчика кадры стека через объект автоматизации DTE
. Объект DTE
должен быть доступен через надстройку. Свойство, которое вы хотите, это Debugger.CurrentThread.StackFrames
. Если вы используете .NET 4, вы можете сделать:
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)
);
}
В противном случае вы можете сделать:
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();
}
Тяжелым и сложным способом было бы использовать ICorDebug
и StackWalk64
, чтобы получить управляемые и нативные стеки по отдельности, а затем соединить их вместе вручную. Поскольку вы являетесь надстройкой VS, вы также можете позволить отладчику сделать тяжелую работу за вас!