Esempio n. 1
0
        } // end _FormatBlocks()

        private ColorString _FormatCharsOnly(uint numColumns, uint bytesPerChar, Func <char, char> toDisplay)
        {
            if (0 == numColumns)
            {
                numColumns = 32; // documentation says it should be 48, but windbg seems to do 32 instead.
            }
            ColorString   cs      = new ColorString();
            StringBuilder sbChars = new StringBuilder((int)numColumns + 8);
            ulong         addr    = StartAddress;

            for (int idx = 0; idx < Count; idx++)
            {
                if (0 == (idx % numColumns))
                {
                    // This is the beginning of a new line.

                    // First finish off the last line if necessary:
                    if (sbChars.Length > 1)
                    {
                        sbChars.Append('"');
                        cs.AppendPushPopFg(ConsoleColor.Cyan, sbChars.ToString());
                    }

                    sbChars.Clear();
                    sbChars.Append('"');

                    if (0 != idx)
                    {
                        cs.AppendLine();
                    }

                    cs.Append(DbgProvider.FormatAddress(addr, m_is32Bit, true, true)).Append("  ");
                    addr += (ulong)numColumns * bytesPerChar;
                } // end start of new line

                // Widen to ulong to accommodate largest possible item.
                ulong val = (ulong)this[idx];

                if (0 == val)
                {
                    break;
                }

                sbChars.Append(toDisplay((char)val));
            } // end for( idx = 0 .. length )

            // Finish off last line.
            if (sbChars.Length > 1)
            {
                sbChars.Append('"');
                cs.AppendPushPopFg(ConsoleColor.Cyan, sbChars.ToString());
            }

            return(cs.MakeReadOnly());
        } // end _FormatCharsOnly()
Esempio n. 2
0
        } // end _FormatCharsOnly()

        private ColorString _FormatBits()
        {
            ColorString cs            = new ColorString();
            uint        bytesPerValue = sizeof(uint);
            uint        bitsPerValue  = bytesPerValue * 8;
            ulong       addr          = StartAddress;

            for (int idx = 0; idx < Count; idx++)
            {
                if (0 != idx)
                {
                    cs.AppendLine();
                }

                cs.Append(DbgProvider.FormatAddress(addr, m_is32Bit, true, true)).Append(" ");
                addr += (ulong)bytesPerValue;

                uint val = this[idx];
                for (int i = 0; i < bitsPerValue; i++)
                {
                    if (i % 8 == 0)
                    {
                        cs.Append(" ");
                    }
                    uint mask = 0x80000000 >> i;
                    if ((mask & val) == mask)
                    {
                        cs.AppendPushPopFg(ConsoleColor.Green, "1");
                    }
                    else
                    {
                        cs.AppendPushPopFg(ConsoleColor.DarkGreen, "0");
                    }
                }

                cs.Append("  " + val.ToString("x").PadLeft(8, '0'));
            } // end for( idx = 0 .. length )

            return(cs.MakeReadOnly());
        } // end _FormatBits()
Esempio n. 3
0
        /// <summary>
        ///    Zero-pads the given value to the specified [string] length. Highlights the
        ///    non-zero portion in Green.
        /// </summary>
        private static ColorString _ZeroPad(ulong val, int desiredLen)
        {
            ColorString cs = null;

            // We need a special case for ulongs to put the ` in.
            if (16 == desiredLen)
            {
                ulong hi = (val & 0xffffffff00000000) >> 32;
                ulong lo = val & 0x00000000ffffffff;

                cs = _ZeroPad(hi, 8);

                // If 'hi' is non-zero, force the bottom half to also be highlighted, even
                // if the bottom half is all zeroes.
                if (0 != hi)
                {
                    cs.AppendPushFg(ConsoleColor.Green);
                }

                cs.Append("`");
                cs.Append(_ZeroPad(lo, 8));

                if (0 != hi)
                {
                    cs.AppendPop();
                }

                return(cs);
            }

            if (0 == val)
            {
                return(new String('0', desiredLen));
            }

            string noLeadingZeroes = val.ToString("x");

            if (noLeadingZeroes.Length == desiredLen)
            {
                return(new ColorString(ConsoleColor.Green, noLeadingZeroes));
            }

            Util.Assert(desiredLen > noLeadingZeroes.Length);

            cs = new ColorString(new String('0', desiredLen - noLeadingZeroes.Length));
            cs.AppendPushPopFg(ConsoleColor.Green, noLeadingZeroes);
            return(cs);
        } // end _ZeroPad()
Esempio n. 4
0
        } // end _FormatBits()

        private static ColorString _DefaultSymLookup(DbgEngDebugger debugger, ulong addr)
        {
            ulong  disp;
            string symName;

            if (debugger.TryGetNameByOffset(addr, out symName, out disp))
            {
                ColorString cs = DbgProvider.ColorizeSymbol(symName);
                if (disp != 0)
                {
                    cs.AppendPushPopFg(ConsoleColor.Gray, "+" + disp.ToString("x"));
                }

                return(cs);
            }
            return(ColorString.Empty);
        } // end _DefaultSymLookup()
Esempio n. 5
0
        private static ColorString _SummarizeModuleList(bool loadedMods, List <object> modObjList, int maxWidth)
        {
            ColorString cs = new ColorString();

            if (0 == modObjList.Count)
            {
                cs.AppendPushPopFg(ConsoleColor.DarkGray, "(0 modules)");
            }
            else
            {
                cs.Append(Util.Sprintf("{0} modules: ", modObjList.Count));

                for (int i = 0; i < Math.Min(modObjList.Count, 3); i++)
                {
                    if (i > 0)
                    {
                        cs.Append(", ");
                    }

                    DbgModuleInfo dmi = (DbgModuleInfo)modObjList[i];
                    if (loadedMods)
                    {
                        cs.Append(DbgProvider.ColorizeModuleName(dmi.Name));
                    }
                    else
                    {
                        cs.Append(dmi.ImageName);
                    }
                }

                if (modObjList.Count > 3)
                {
                    cs.Append(", ...");
                }
            }

            return(CaStringUtil.Truncate(cs.ToString(DbgProvider.HostSupportsColor), maxWidth));
        } // end _SummarizeModuleList()
Esempio n. 6
0
        } // end _ZeroPad()

        private ColorString _FormatBlocks(int elemSize,
                                          int charsPerBlock,
                                          uint numColumns,
                                          AddtlInfo addtlInfo)
        {
            if (0 == numColumns)
            {
                numColumns = (uint)(16 / elemSize);
            }

            if (addtlInfo.HasFlag(AddtlInfo.Symbols))
            {
                numColumns = 1;
            }

            int           desiredLen = elemSize * 2;
            ColorString   cs         = new ColorString();
            StringBuilder sbChars    = new StringBuilder(20);
            ulong         addr       = StartAddress;

            cs.AppendPushFg(ConsoleColor.DarkGreen);

            for (int idx = 0; idx < Count; idx++)
            {
                if (0 == (idx % numColumns))
                {
                    // This is the beginning of a new line.

                    // First finish off the last line if necessary:
                    if (addtlInfo.HasFlag(AddtlInfo.Ascii))
                    {
                        if (sbChars.Length > 2)
                        {
                            cs.AppendPushPopFg(ConsoleColor.Cyan, sbChars.ToString());
                        }

                        sbChars.Clear();
                        sbChars.Append("  ");
                    }

                    if (0 != idx)
                    {
                        cs.AppendLine();
                    }

                    cs.Append(DbgProvider.FormatAddress(addr, m_is32Bit, true, true)).Append("  ");
                    addr += (ulong)(numColumns * elemSize);
                } // end start of new line
                else
                {
                    cs.Append(" ");
                }

                // Widen to ulong to accommodate largest possible item.
                ulong val = (ulong)this[idx];

                // This highlights the non-zero portion in [bright] green.
                cs.Append(_ZeroPad(val, desiredLen));

                if (addtlInfo.HasFlag(AddtlInfo.Symbols))
                {
                    ColorString csSym = ColorString.Empty;
                    if (val > 4096)  // don't even bother trying if it's too low.
                    {
                        csSym = m_lookupSymbol(val);
                        if (csSym.Length > 0)
                        {
                            cs.Append(" ").Append(csSym);
                        }
                    }
                    if (addtlInfo.HasFlag(AddtlInfo.Ascii))
                    {
                        if (0 == csSym.Length)
                        {
                            cs.Append("                                          ");
                            _AppendChars(sbChars, idx * elemSize, elemSize);
                        }
                    }
                } // end if( symbols )
                else if (addtlInfo.HasFlag(AddtlInfo.Ascii))
                {
                    _AppendChars(sbChars, idx * elemSize, elemSize);
                } // end else if( Ascii )
            }     // end for( idx = 0 .. length )

            // Finish off last line.
            if (sbChars.Length > 2)
            {
                // It could be a partial line, so we may need to adjust for that.
                int numMissing = (int)numColumns - ((sbChars.Length - 2) / elemSize);
                Util.Assert(numMissing >= 0);
                if (numMissing > 0)
                {
                    cs.Append(new String(' ', numMissing * charsPerBlock));
                }
                cs.AppendPushPopFg(ConsoleColor.Cyan, sbChars.ToString());
            }

            cs.AppendPop(); // pop DarkGreen

            return(cs.MakeReadOnly());
        } // end _FormatBlocks()
Esempio n. 7
0
        public ColorString ToColorString()
        {
            if (DEBUG_EVENT.NONE == EventType)
            {
                return(ColorString.Empty);
            }

            ColorString csThreadId;

            if (0xffffffff == ThreadId)
            {
                csThreadId = new ColorString(ConsoleColor.Red, "ffffffff");
            }
            else
            {
                csThreadId = new ColorString(m_debugger.GetUModeThreadByDebuggerId(ThreadId).Tid.ToString("x"));
            }

            ColorString cs = new ColorString(ConsoleColor.Black, ConsoleColor.White, "     Last event:")
                             .Append(" ")
                             .Append(m_debugger.GetProcessSystemId(ProcessId).ToString("x"))
                             .Append(".")
                             .Append(csThreadId)
                             .Append(": ");

            DbgModuleInfo mod = null;
            string        tmp = null;

            string[] lines = null;

            switch (EventType)
            {
            case DEBUG_EVENT.NONE:
                Util.Fail("can't get here");       // we returned ColorString.Empty above
                break;

            case DEBUG_EVENT.BREAKPOINT:
                cs.Append(Description);

                break;

            case DEBUG_EVENT.EXCEPTION:
                tmp = ExceptionEventArgs._CreateMessage(m_debugger,
                                                        ExtraInformation.Exception.ExceptionRecord,
                                                        ExtraInformation.Exception.FirstChance != 0,
                                                        0,
                                                        null,
                                                        false).ToString(DbgProvider.HostSupportsColor);

                lines = tmp.Split(sm_newline, StringSplitOptions.None);

                cs.AppendLine(lines[0]);
                for (int i = 1; i < lines.Length; i++)
                {
                    cs.AppendPushPopFgBg(ConsoleColor.Black, ConsoleColor.White, "                ")
                    .Append(" ")
                    .Append(lines[i]);

                    if (i != lines.Length - 1)
                    {
                        cs.AppendLine();
                    }
                }

                break;

            case DEBUG_EVENT.CREATE_THREAD:
                cs.Append(Description);

                break;

            case DEBUG_EVENT.EXIT_THREAD:
                cs.Append(Description);

                break;

            case DEBUG_EVENT.CREATE_PROCESS:
                cs.Append(Description);

                break;

            case DEBUG_EVENT.EXIT_PROCESS:
                cs.Append(Description);

                break;

            case DEBUG_EVENT.LOAD_MODULE:
                //
                //   Last event: 9c84.3984: Load module C:\WINDOWS\system32\ADVAPI32.dll at 00007ffb`b0cd0000
                //     debugger time: Mon Oct 20 19:30:56.164 2014 (UTC - 7:00)

                mod = m_debugger.GetModuleByAddress(ExtraInformation.LoadModule.Base);
                cs.Append("Loaded module ")
                .AppendPushPopFg(ConsoleColor.White, mod.ImageName)
                .Append(" at ")
                .Append(DbgProvider.FormatAddress(ExtraInformation.LoadModule.Base,
                                                  m_debugger.TargetIs32Bit,
                                                  true));
                break;

            case DEBUG_EVENT.UNLOAD_MODULE:
                // TODO: test this!
                mod = m_debugger.GetModuleByAddress(ExtraInformation.UnloadModule.Base);
                cs.AppendPushPopFg(ConsoleColor.DarkRed, "Unloaded module ")
                .AppendPushPopFg(ConsoleColor.White, mod.ImageName)
                .Append(" at ")
                .Append(DbgProvider.FormatAddress(ExtraInformation.UnloadModule.Base,
                                                  m_debugger.TargetIs32Bit,
                                                  true));
                break;

            case DEBUG_EVENT.SYSTEM_ERROR:
                // TODO: test this!
                cs.AppendPushPopFgBg(ConsoleColor.White, ConsoleColor.Red, "System error:")
                .Append(" ")
                .AppendPushPopFg(ConsoleColor.Red, Util.FormatErrorCode(ExtraInformation.SystemError.Error))
                .Append(".")
                .AppendPushPopFg(ConsoleColor.Red, Util.FormatErrorCode(ExtraInformation.SystemError.Level));

                // TODO: This is a hack.
                var w32e = new System.ComponentModel.Win32Exception((int)ExtraInformation.SystemError.Error);
                cs.AppendLine();
                cs.AppendPushPopFg(ConsoleColor.Red, w32e.Message).Append(".");

                break;

            case DEBUG_EVENT.SESSION_STATUS:
                // DbgEng doesn't save these as "last events".
                Util.Fail(Util.Sprintf("Unexpected last event type: {0}", EventType));

                break;

            case DEBUG_EVENT.CHANGE_DEBUGGEE_STATE:
                // DbgEng doesn't save these as "last events".
                Util.Fail(Util.Sprintf("Unexpected last event type: {0}", EventType));

                break;

            case DEBUG_EVENT.CHANGE_ENGINE_STATE:
                // DbgEng doesn't save these as "last events".
                Util.Fail(Util.Sprintf("Unexpected last event type: {0}", EventType));

                break;

            case DEBUG_EVENT.CHANGE_SYMBOL_STATE:
                // DbgEng doesn't save these as "last events".
                Util.Fail(Util.Sprintf("Unexpected last event type: {0}", EventType));

                break;

            default:
                Util.Fail(Util.Sprintf("Unexpected event type: {0}", EventType));
                throw new Exception(Util.Sprintf("Unexpected event type: {0}", EventType));
            } // end switch( event type )


            cs.AppendLine()
            .AppendPushPopFgBg(ConsoleColor.Black, ConsoleColor.White, "  Debugger time:")
            .Append(" ")
            .Append(DbgProvider.FormatTimestamp(_GetDbgEngLastEventTimestamp(), true));

            return(cs);
        } // end ToColorString()
Esempio n. 8
0
        } // end GetValueString()

        public ColorString GetColorizedValueString(ConsoleColor color)
        {
            object valObj = Value;

            if (valObj is byte[])
            {
                // TODO: add another Util.FormatBytes overload?
                byte[]        bytes        = valObj as byte[];
                StringBuilder sb           = new StringBuilder(bytes.Length * 3);
                bool          prependSpace = false;
                foreach (byte b in bytes)
                {
                    if (prependSpace)
                    {
                        sb.Append(' ');
                    }
                    else
                    {
                        prependSpace = true;
                    }

                    sb.AppendFormat("{0:x2}", b);
                }
                return(new ColorString().AppendPushPopFg(color, sb.ToString()));
            }

            string noLeadingZeroes;

            try
            {
                noLeadingZeroes = Util.Sprintf("{0:x}", valObj);
            }
            catch (FormatException)
            {
                Util.Fail("I guess we need to handle this case...");
                // float, double, what else?

                if (null == valObj)
                {
                    return(new ColorString().AppendPushPopFg(color, "<value type not supported yet>"));
                }
                else
                {
                    //return Util.GetGenericTypeName( valObj );
                    return(new ColorString().AppendPushPopFg(color, valObj.ToString()));
                }
            }

            int desiredWidth = 0;

            if (valObj is byte)
            {
                desiredWidth = 2;
            }
            else if (valObj is short)
            {
                desiredWidth = 4;
            }
            else if (valObj is ushort)
            {
                desiredWidth = 4;
            }
            else if (valObj is int)
            {
                desiredWidth = 8;
            }
            else if (valObj is uint)
            {
                desiredWidth = 8;
            }
            else if (valObj is long)
            {
                desiredWidth = 16;
            }
            else if (valObj is ulong)
            {
                desiredWidth = 16;
            }
            else // float, double, what else?
            {
                Util.Fail("missed something");
                if (null == valObj)
                {
                    return(new ColorString().AppendPushPopFg(color, "<value type not supported yet>"));
                }
                else
                {
                    //return Util.GetGenericTypeName( valObj );
                    return(new ColorString().AppendPushPopFg(color, valObj.ToString()));
                }
            }

            if (noLeadingZeroes.Length == desiredWidth)
            {
                return(new ColorString().AppendPushPopFg(color, noLeadingZeroes));
            }

            Util.Assert(desiredWidth > noLeadingZeroes.Length);
            ColorString cs = new ColorString();

            ConsoleColor darkColor  = color;
            int          iDarkColor = ((int)color) - 8;

            if (iDarkColor > 0)
            {
                darkColor = (ConsoleColor)iDarkColor;
            }

            cs.AppendPushPopFg(darkColor, new String('0', desiredWidth - noLeadingZeroes.Length));
            cs.AppendPushPopFg(color, noLeadingZeroes);
            return(cs);
        } // end GetColorizedValueString()
Esempio n. 9
0
        } // end GetName()

        private static void _AppendDimension(ColorString cs, uint dim)
        {
            cs.AppendPushPopFg(ConsoleColor.Yellow, "[")
            .AppendPushPopFg(ConsoleColor.DarkYellow, dim.ToString())
            .AppendPushPopFg(ConsoleColor.Yellow, "]");
        }
Esempio n. 10
0
        // Example:
        //
        //   eax=7ffdb000 ebx=00000000 ecx=00000000 edx=7785f17d esi=00000000 edi=00000000
        //   eip=777f410c esp=040ef770 ebp=040ef79c iopl=0         nv up ei pl zr na pe nc
        //   cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
        //   ntdll!DbgBreakPoint:
        //
        public override ColorString ToColorString()
        {
            if (null == m_colorString)
            {
                ConsoleColor color;
                ColorString  cs = new ColorString("eax=");
                color = GetColorForDiffAgainstBaseline("eax");
                cs.Append(Eax.GetColorizedValueString(color));
                cs.Append(" ebx=");
                color = GetColorForDiffAgainstBaseline("ebx");
                cs.Append(Ebx.GetColorizedValueString(color));
                cs.Append(" ecx=");
                color = GetColorForDiffAgainstBaseline("ecx");
                cs.Append(Ecx.GetColorizedValueString(color));
                cs.Append(" edx=");
                color = GetColorForDiffAgainstBaseline("edx");
                cs.Append(Edx.GetColorizedValueString(color));
                cs.Append(" esi=");
                color = GetColorForDiffAgainstBaseline("esi");
                cs.Append(Esi.GetColorizedValueString(color));
                cs.Append(" edi=");
                color = GetColorForDiffAgainstBaseline("edi");
                cs.Append(Edi.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append("eip=");
                color = GetColorForDiffAgainstBaseline("eip");
                cs.Append(Eip.GetColorizedValueString(color));
                cs.Append(" esp=");
                color = GetColorForDiffAgainstBaseline("esp");
                cs.Append(Esp.GetColorizedValueString(color));
                cs.Append(" ebp=");
                color = GetColorForDiffAgainstBaseline("ebp");
                cs.Append(Ebp.GetColorizedValueString(color));
                cs.Append(" iopl=");
                color = GetColorForDiffAgainstBaseline("iopl");
                cs.AppendPushPopFg(color, ((uint)Iopl.Value).ToString("x"));
                // TODO:
                cs.AppendLine("   TBD: flags");

                cs.Append("cs=");
                color = GetColorForDiffAgainstBaseline("cs");
                cs.AppendPushPopFg(color, ((uint)Cs.Value).ToString("x4"));
                cs.Append("  ss=");
                color = GetColorForDiffAgainstBaseline("ss");
                cs.AppendPushPopFg(color, ((uint)Ss.Value).ToString("x4"));
                cs.Append("  ds=");
                color = GetColorForDiffAgainstBaseline("ds");
                cs.AppendPushPopFg(color, ((uint)Ds.Value).ToString("x4"));
                cs.Append("  es=");
                color = GetColorForDiffAgainstBaseline("es");
                cs.AppendPushPopFg(color, ((uint)Es.Value).ToString("x4"));
                cs.Append("  fs=");
                color = GetColorForDiffAgainstBaseline("fs");
                cs.AppendPushPopFg(color, ((uint)Fs.Value).ToString("x4"));
                cs.Append("  gs=");
                color = GetColorForDiffAgainstBaseline("gs");
                cs.AppendPushPopFg(color, ((uint)Gs.Value).ToString("x4"));
                cs.Append("             efl=");
                color = GetColorForDiffAgainstBaseline("efl");
                cs.Append(Efl.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append(DbgProvider.ColorizeSymbol(StackFrame.SymbolName));
                if (0 != StackFrame.Displacement)
                {
                    cs.Append("+0x");
                    cs.Append(StackFrame.Displacement.ToString("x"));
                }
                cs.AppendLine(":");
                cs.Append(Disasm(Eip.ValueAsPointer));

                m_colorString = cs;
            }
            return(m_colorString);
        } // end ToString()
Esempio n. 11
0
        // Example:
        //
        // rax=000007f7d5e4e000 rbx=0000000000000000 rcx=0000000000000000
        // rdx=000007fcac628f98 rsi=0000000000000000 rdi=0000000000000000
        // rip=000007fcac571e00 rsp=0000000b9879fb78 rbp=0000000000000000
        //  r8=0000000000000000  r9=000007fcac628f98 r10=0000000000000000
        // r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
        // r14=0000000000000000 r15=0000000000000000
        // iopl=0         nv up ei pl zr na po nc
        // cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
        //   ntdll!DbgBreakPoint:
        //
        public override ColorString ToColorString()
        {
            if (null == m_colorString)
            {
                ConsoleColor color;
                ColorString  cs = new ColorString("rax=");
                color = GetColorForDiffAgainstBaseline("rax");
                cs.Append(Rax.GetColorizedValueString(color));
                cs.Append(" rbx=");
                color = GetColorForDiffAgainstBaseline("rbx");
                cs.Append(Rbx.GetColorizedValueString(color));
                cs.Append(" rcx=");
                color = GetColorForDiffAgainstBaseline("rcx");
                cs.Append(Rcx.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append("rdx=");
                color = GetColorForDiffAgainstBaseline("rdx");
                cs.Append(Rdx.GetColorizedValueString(color));
                cs.Append(" rsi=");
                color = GetColorForDiffAgainstBaseline("rsi");
                cs.Append(Rsi.GetColorizedValueString(color));
                cs.Append(" rdi=");
                color = GetColorForDiffAgainstBaseline("rdi");
                cs.Append(Rdi.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append("rip=");
                color = GetColorForDiffAgainstBaseline("rip");
                cs.Append(Rip.GetColorizedValueString(color));
                cs.Append(" rsp=");
                color = GetColorForDiffAgainstBaseline("rsp");
                cs.Append(Rsp.GetColorizedValueString(color));
                cs.Append(" rbp=");
                color = GetColorForDiffAgainstBaseline("rbp");
                cs.Append(Rbp.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append(" r8=");
                color = GetColorForDiffAgainstBaseline("r8");
                cs.Append(R8.GetColorizedValueString(color));
                cs.Append("  r9=");
                color = GetColorForDiffAgainstBaseline("r9");
                cs.Append(R9.GetColorizedValueString(color));
                cs.Append(" r10=");
                color = GetColorForDiffAgainstBaseline("r10");
                cs.Append(R10.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append("r11=");
                color = GetColorForDiffAgainstBaseline("r11");
                cs.Append(R11.GetColorizedValueString(color));
                cs.Append(" r12=");
                color = GetColorForDiffAgainstBaseline("r12");
                cs.Append(R12.GetColorizedValueString(color));
                cs.Append(" r13=");
                color = GetColorForDiffAgainstBaseline("r13");
                cs.Append(R13.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append("r14=");
                color = GetColorForDiffAgainstBaseline("r14");
                cs.Append(R14.GetColorizedValueString(color));
                cs.Append(" r15=");
                color = GetColorForDiffAgainstBaseline("r15");
                cs.Append(R15.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append("iopl=");
                color = GetColorForDiffAgainstBaseline("iopl");
                cs.AppendPushPopFg(color, ((ulong)Iopl.Value).ToString("x"));
                // TODO:
                cs.AppendLine("   TBD: flags");

                cs.Append("cs=");
                color = GetColorForDiffAgainstBaseline("cs");
                cs.AppendPushPopFg(color, ((ushort)Cs.Value).ToString("x4"));
                cs.Append("  ss=");
                color = GetColorForDiffAgainstBaseline("ss");
                cs.AppendPushPopFg(color, ((ushort)Ss.Value).ToString("x4"));
                cs.Append("  ds=");
                color = GetColorForDiffAgainstBaseline("ds");
                cs.AppendPushPopFg(color, ((ushort)Ds.Value).ToString("x4"));
                cs.Append("  es=");
                color = GetColorForDiffAgainstBaseline("es");
                cs.AppendPushPopFg(color, ((ushort)Es.Value).ToString("x4"));
                cs.Append("  fs=");
                color = GetColorForDiffAgainstBaseline("fs");
                cs.AppendPushPopFg(color, ((ushort)Fs.Value).ToString("x4"));
                cs.Append("  gs=");
                color = GetColorForDiffAgainstBaseline("gs");
                cs.AppendPushPopFg(color, ((ushort)Gs.Value).ToString("x4"));
                cs.Append("             efl=");
                color = GetColorForDiffAgainstBaseline("efl");
                cs.Append(Efl.GetColorizedValueString(color));
                cs.AppendLine();

                cs.Append(DbgProvider.ColorizeSymbol(StackFrame.SymbolName));
                if (0 != StackFrame.Displacement)
                {
                    cs.Append("+0x");
                    cs.Append(StackFrame.Displacement.ToString("x"));
                }
                cs.AppendLine(":");
                cs.Append(Disasm(Rip.ValueAsPointer));

                m_colorString = cs;
            }
            return(m_colorString);
        } // end ToString()