Как получить трассировку стека запущенного процесса из надстройки Visual Studio? - PullRequest
5 голосов
/ 02 июня 2010

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

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

Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 02 июня 2010

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

0 голосов
/ 02 июня 2010

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

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

...