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

标签 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);

如有任何帮助,我们将不胜感激。

最佳答案

最简单的方法是通过 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分别获取托管堆栈和 native 堆栈,然后手动将它们拼接在一起。由于您是 VS 加载项,您不妨让调试器为您完成繁重的工作!

关于c# - 如何从 Visual Studio 加载项中获取正在运行的进程的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2954079/

相关文章:

debugging - Xamarin Studio 5 Unity 加载项存储库

c# - 使用 Composition 在 C# 中自动生成 Wrapper 类

c# - 使用 C#/Linq 生成固定的字符串序列

c# - 当使用 long else if - C# 时,使用什么更好

c# - 如何检测 HTTPWebRequest 中的客户端证书身份验证请求?

c# - Visual Studio SQL 数据库,执行批处理时出错(消息 1785)

c++ - 如何在 Visual Studio 2012 中用 C++11 替换所有 BOOST_FOREACH?

add-in - C# : Excel 2007 Addin, 如何 Hook Windows 激活和停用事件

wpf - 如何在 Visual Studio 2010 中为数值数组创建自定义图像装饰插件?

c# - 如何在 winrt 中为圆形路径上的文本设置动画?