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); }
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); }