如何从Visual Studio加载项中获取正在运行的进程的堆栈跟踪?

我在C#中编写一个Visual Studio加载项,当我在同一个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().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(); } 

痛苦和参与的方式是使用ICorDebugStackWalk64分别获取托管和本机堆栈,然后手动将它们拼接在一起。 既然你是一个VS加载项,你也可以让调试器为你做繁重的工作!

代码正在按预期工作,因为当您调用代码时,您的加载项(在VS下)是“当前进程”。

我不确定“当前正在运行的进程”是什么意思(你的意思是在VS下运行/调试进程吗?),但我认为不可能获得另一个进程的堆栈跟踪。