} // 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()
} // 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()
/// <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()
} // 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()
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()
} // 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()
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()
} // 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()
} // end GetName() private static void _AppendDimension(ColorString cs, uint dim) { cs.AppendPushPopFg(ConsoleColor.Yellow, "[") .AppendPushPopFg(ConsoleColor.DarkYellow, dim.ToString()) .AppendPushPopFg(ConsoleColor.Yellow, "]"); }
// 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()
// 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()