Я пишу дополнение Visual Studio в C#, который будет работать, в то время как я отлаживаю процесс в том же окне Visual Studio, и мне нужен доступ к этому отслеживание стека процесса из моего дополнения. Я пытался поместить этот код в свое дополнение, но это возвращает отслеживание стека дополнения, не процесс, который я отлаживаю.
System.Diagnostics.StackTrace stacktrace = new System.Diagnostics.StackTrace(true);
System.Diagnostics.StackFrame stackframe = stacktrace.GetFrame(0);
Любая справка ценилась бы.
Самый простой способ - запросить у отладчика кадры стека через объект автоматизации 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, вы можете позволить отладчику сделать всю тяжелую работу за вас!
Код работает, как и ожидалось, поскольку при вызове кода ваша надстройка (под VS) является "текущим процессом".
Я не уверен, что вы имеете в виду под "текущим процессом" (вы имеете в виду процесс, который выполняется/отлаживается под VS?), но я не думаю, что возможно получить стек-трейс другого процесса.