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

时间:2010-06-01 23:34:21

标签: 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 = stacktrace.GetFrame(0);

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

最简单的方法是通过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();
    }

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

答案 1 :(得分:-1)

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

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