我正在用 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<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
分别获取托管堆栈和 native 堆栈,然后手动将它们拼接在一起。由于您是 VS 加载项,您不妨让调试器为您完成繁重的工作!
关于c# - 如何从 Visual Studio 加载项中获取正在运行的进程的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2954079/