示例#1
0
        private int GetInterpolatedLogMessage(string logMessage, IDebugThread2 pThread, uint radix, string processName, int processId, out string message)
        {
            int hr = HRConstants.S_OK;

            if (pThread == null)
            {
                message = AD7Resources.Error_InterpolateMissingThread;
                return(HRConstants.E_FAIL);
            }

            // Get topFrame
            IEnumDebugFrameInfo2 frameInfoEnum;

            hr = pThread.EnumFrameInfo(enum_FRAMEINFO_FLAGS.FIF_FRAME | enum_FRAMEINFO_FLAGS.FIF_FLAGS, Constants.EvaluationRadix, out frameInfoEnum);
            if (hr < 0)
            {
                message = AD7Resources.Error_InterpolateMissingFrames;
                return(hr);
            }

            FRAMEINFO[] topFrame = new FRAMEINFO[1];
            uint        fetched  = 0;

            hr = frameInfoEnum.Next(1, topFrame, ref fetched);
            if (hr < 0 || fetched != 1 || topFrame[0].m_pFrame == null)
            {
                message = AD7Resources.Error_InterpolateMissingTopFrame;
                return(hr);
            }

            Dictionary <string, string> seenExpressions = new Dictionary <string, string>();
            StringBuilder sb        = new StringBuilder();
            int           currIndex = 0;

            foreach (KeyValuePair <int, string> keyValuePair in m_indexToExpressions)
            {
                // Add all characters between current index to the insertion index.
                sb.Append(LogMessage.Substring(currIndex, keyValuePair.Key - currIndex));

                // Move current index to end of replaced string.
                currIndex = keyValuePair.Key + keyValuePair.Value.Length;

                if (!seenExpressions.TryGetValue(keyValuePair.Value, out string value))
                {
                    if (keyValuePair.Value[0] == '$')
                    {
                        value = InterpolateToken(keyValuePair.Value, pThread, topFrame[0].m_pFrame, radix, processName, processId);
                    }
                    else
                    {
                        string toInterpolate = keyValuePair.Value;
                        if (InterpolateVariable(toInterpolate.Substring(1, toInterpolate.Length - 2), topFrame[0].m_pFrame, radix, out value) < 0)
                        {
                            hr = HRConstants.E_FAIL;
                            DebuggerTelemetry.ReportError(DebuggerTelemetry.TelemetryTracepointEventName, value);

                            // Re-write error message
                            value = string.Format(CultureInfo.CurrentCulture, "<Failed to interpolate {0}: \"{1}\">", toInterpolate, value);
                        }
                    }

                    // Cache expression
                    seenExpressions[keyValuePair.Value] = value;
                }
                sb.Append(value);
            }

            // Append the rest of LogMessage
            sb.Append(LogMessage.Substring(currIndex, LogMessage.Length - currIndex));

            message = sb.ToString();

            return(hr);
        }
示例#2
0
        public static void InitializeTelemetry(Action <DebugEvent> telemetryCallback, TypeInfo engineType, TypeInfo hostType, string adapterId)
        {
            Debug.Assert(telemetryCallback != null, "InitializeTelemetry called with incorrect values.");

            s_telemetryInstance = new DebuggerTelemetry(telemetryCallback, engineType, hostType, adapterId);
        }