Как получить отслеживание стека рабочего процесса из дополнения Visual Studio?

Я пишу дополнение Visual Studio в C#, который будет работать, в то время как я отлаживаю процесс в том же окне Visual Studio, и мне нужен доступ к этому отслеживание стека процесса из моего дополнения. Я пытался поместить этот код в свое дополнение, но это возвращает отслеживание стека дополнения, не процесс, который я отлаживаю.

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

Любая справка ценилась бы.

5
задан johnnyRose 5 June 2019 в 17:31
поделиться

2 ответа

Самый простой способ - запросить у отладчика кадры стека через объект автоматизации 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 для получить управляемые и собственные стеки по отдельности, а затем сшить их вручную. Поскольку вы являетесь надстройкой VS, вы можете позволить отладчику сделать всю тяжелую работу за вас!

4
ответ дан 15 December 2019 в 06:17
поделиться

Код работает, как и ожидалось, поскольку при вызове кода ваша надстройка (под VS) является "текущим процессом".

Я не уверен, что вы имеете в виду под "текущим процессом" (вы имеете в виду процесс, который выполняется/отлаживается под VS?), но я не думаю, что возможно получить стек-трейс другого процесса.

-1
ответ дан 15 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: