The easiest way would be to ask the debugger for the stack frames through the DTE automation object.  The DTE object should be available to you through your add-in.  The property you want is Debugger.CurrentThread.StackFrames.  If you're using .NET 4, you can do:
    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)
        );
    }
Otherwise, you can do:
    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();
    }
The painful and involved way would be to use ICorDebug and StackWalk64 to get managed and native stacks separately and then stitch them together by hand.  Since you're a VS add-in, you might as well let the debugger do the heavy lifting for you!