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

C# 如何从VisualStudio加载项中获取正在运行的进程的堆栈跟踪?,c#,visual-studio,add-in,stack-trace,C#,Visual Studio,Add In,Stack Trace,我正在用C#编写一个Visual Studio外接程序,它将在调试同一Visual Studio窗口中的进程时运行,我需要从外接程序中访问该进程的堆栈跟踪。我尝试将此代码放入外接程序,但它返回外接程序的堆栈跟踪,而不是我正在调试的进程 System.Diagnostics.StackTrace stacktrace = new System.Diagnostics.StackTrace(true); System.Diagnostics.StackFrame stackframe = stack

我正在用C#编写一个Visual Studio外接程序,它将在调试同一Visual Studio窗口中的进程时运行,我需要从外接程序中访问该进程的堆栈跟踪。我尝试将此代码放入外接程序,但它返回外接程序的堆栈跟踪,而不是我正在调试的进程

System.Diagnostics.StackTrace stacktrace = new System.Diagnostics.StackTrace(true);
System.Diagnostics.StackFrame stackframe = stacktrace.GetFrame(0);

任何帮助都将不胜感激。

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


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

最简单的方法是通过
DTE
自动化对象向调试器请求堆栈帧。
DTE
对象应该可以通过外接程序访问。你想要的财产是。如果您使用的是.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();
    }

痛苦而复杂的方法是分别使用和获取托管堆栈和本机堆栈,然后手工将它们缝合在一起。既然您是一个VS加载项,那么不妨让调试器为您完成繁重的工作

是的,我正在Visual Studio中运行外接程序,同时我正在同一Visual Studio窗口中调试进程,我需要访问外接程序中该进程的堆栈跟踪。非常感谢您的回答!我一定会尝试一下。有没有可能你知道如何获取行号和/或函数签名?没关系,算出了(但它并不漂亮)看。基本上,您可以调用
DTE.Debugger.GetExpression
通过调试器计算表达式。这可能会帮助您获取异常信息。