public ColorString ToColorString() { if (null == m_cs) { m_cs = new ColorString(); m_cs.Append(DbgProvider.ColorizeModuleName(m_udt.Module.Name)) .Append("!") .Append(m_udt.ColorName) .Append(" (size 0x") .Append(m_udt.Size.ToString("x")) .Append(")"); int widest = 16; foreach (var item in Items) { var ddti = item.Item as DbgDataTypeInfo; if (null != ddti) { widest = Math.Max(widest, ddti.Name.Length); } } widest = Math.Min(widest, 40); foreach (var item in Items) { m_cs.AppendLine() .Append(" +0x") .Append(item.Offset.ToString("x3")) .Append(" "); var ddti = item.Item as DbgDataTypeInfo; if (null != ddti) { m_cs.Append(ColorString.MakeFixedWidth(ddti.Name, widest)) .Append(" : ") .Append(ddti.DataType.ColorName); } else { VTableLayoutItem vli = (VTableLayoutItem)item; var dvti = (DbgVTableTypeInfo)item.Item; m_cs.AppendPushFg(ConsoleColor.DarkGray); if (vli.VTablePath.Count > 1) { m_cs.Append(vli.VTablePath[1].ColorName).Append(": "); } m_cs.Append(dvti.ToColorString()) .AppendPop(); } } m_cs.MakeReadOnly(); } // end if( !m_cs ) return(m_cs); } // end ToColorString()
} // end ToString(); public ColorString ToColorString() { ColorString cs = new ColorString(); foreach (DbgStackFrameInfo frame in EnumerateStackFrames()) { cs.AppendLine(frame.ToColorString()); } return(cs); } // end ToColorString()
} // 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()
} // 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()
// Example: // // 0:009> r // r0=00000000 r1=00000000 r2=00000000 r3=76fdcf09 r4=00000000 r5=028df6e0 // r6=028df730 r7=00000000 r8=00000001 r9=01507858 r10=015156a8 r11=028df8e8 // r12=00000000 sp=028df6c8 lr=00000000 pc=76ccce24 psr=600f0030 -ZC-- Thumb // KERNELBASE!RaiseFailFastException+0x60: // 76ccce24 f000f846 bl KERNELBASE!SignalStartWerSvc (76ccceb4) // public override ColorString ToColorString() { if (null == m_colorString) { ConsoleColor color; ColorString cs = new ColorString(" r0="); color = GetColorForDiffAgainstBaseline("r0"); cs.Append(R0.GetColorizedValueString(color)); cs.Append(" r1="); color = GetColorForDiffAgainstBaseline("r1"); cs.Append(R1.GetColorizedValueString(color)); cs.Append(" r2="); color = GetColorForDiffAgainstBaseline("r2"); cs.Append(R2.GetColorizedValueString(color)); cs.Append(" r3="); color = GetColorForDiffAgainstBaseline("r3"); cs.Append(R3.GetColorizedValueString(color)); cs.Append(" r4="); color = GetColorForDiffAgainstBaseline("r4"); cs.Append(R4.GetColorizedValueString(color)); cs.Append(" r5="); color = GetColorForDiffAgainstBaseline("r5"); cs.Append(R5.GetColorizedValueString(color)); cs.AppendLine(); cs.Append(" r6="); color = GetColorForDiffAgainstBaseline("r6"); cs.Append(R6.GetColorizedValueString(color)); cs.Append(" r7="); color = GetColorForDiffAgainstBaseline("r7"); cs.Append(R7.GetColorizedValueString(color)); 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.Append(" r11="); color = GetColorForDiffAgainstBaseline("r11"); cs.Append(R11.GetColorizedValueString(color)); cs.AppendLine(); cs.Append("r12="); color = GetColorForDiffAgainstBaseline("r12"); cs.Append(R12.GetColorizedValueString(color)); cs.Append(" sp="); color = GetColorForDiffAgainstBaseline("sp"); cs.Append(Sp.GetColorizedValueString(color)); cs.Append(" lr="); color = GetColorForDiffAgainstBaseline("lr"); cs.Append(Lr.GetColorizedValueString(color)); cs.Append(" pc="); color = GetColorForDiffAgainstBaseline("pc"); cs.Append(Pc.GetColorizedValueString(color)); cs.Append(" psr="); color = GetColorForDiffAgainstBaseline("psr"); cs.Append(Psr.GetColorizedValueString(color)); // TODO: cs.AppendLine(" TBD: flags and mode"); cs.Append(DbgProvider.ColorizeSymbol(StackFrame.SymbolName)); if (0 != StackFrame.Displacement) { cs.Append("+0x"); cs.Append(StackFrame.Displacement.ToString("x")); } cs.AppendLine(":"); cs.Append(Disasm(Pc.ValueAsPointer)); m_colorString = cs; } return(m_colorString); } // end ToString()
// 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()