public static StructValueStrings GetStructValueStrings(StructFieldsInfo sfi, ClrHeap heap, ulong addr) { if (!sfi.IsTotalFldCountSet) { sfi.SetTotalFldCount(); } var values = new string[sfi._fields.Length]; StructValueStrings[] structs = null; for (int i = 0, icnt = sfi._fields.Length; i < icnt; ++i) { if (sfi._structFlds != null && sfi._structFlds[i] != null) { if (structs == null) { structs = new StructValueStrings[sfi._fields.Length]; } var faddr = sfi._fields[i].GetAddress(addr, true); structs[i] = GetStructValueStrings(sfi._structFlds[i], heap, faddr); } else { values[i] = GetValueAsString(sfi._types[i], sfi._typeKinds[i], sfi._fields[i], sfi._fldKinds[i], heap, addr, true); } } return(new StructValueStrings(values, structs)); }
public static StructValueStrings GetStructValueStrings(StructFieldsEx structFld, ClrHeap heap, ulong addr) { var cnt = structFld._fields.Length; var structInfo = structFld._structFields; var vals = new string[cnt]; StructValueStrings[] structVals = null; for (int i = 0; i < cnt; ++i) { if (structInfo.IsAmbiguousKind(i)) { var fobj = structFld._fields[i].GetValue(addr, true); var faddr = (ulong)fobj; var ftype = heap.GetObjectType(faddr); if (ftype != null) { structFld._types[i] = ftype; structInfo.SetKind(TypeExtractor.GetElementKind(ftype), i); } } var fldType = structFld._types[i]; var fld = structFld._fields[i]; var kind = structFld._structFields.Kinds[i]; Debug.Assert(fld != null); if (structFld._ex?[i] != null) { if (structVals == null) { structVals = new StructValueStrings[cnt]; } structVals[i] = GetStructValueStrings(structFld._ex[i], heap, fld.GetAddress(addr, true)); } else if (fldType != null) { var fobj = fld.GetValue(addr, true); var faddr = (ulong)fobj; vals[i] = ValueExtractor.GetTypeValueString(heap, faddr, fldType, true, kind); } else { if (TypeExtractor.IsKnownPrimitive(kind)) { vals[i] = ValueExtractor.GetFieldValueString(heap, addr, true, fld, kind); } else { var fobj = fld.GetAddress(addr, true); var faddr = (ulong)fobj; vals[i] = ValueExtractor.GetFieldValueString(heap, faddr, true, fld, kind); } } } return(new StructValueStrings(vals, structVals)); }
public static string[] GetStrings(StructValueStrings[] vals) { if (vals == null) { return(null); } string[] strvals = new string[vals.Length]; for (int i = 0, icnt = vals.Length; i < icnt; ++i) { strvals[i] = StructValueStrings.MergeValues(vals[i]); } return(strvals); }
public static string MergeValues(StructValueStrings val) { StringBuilder sb = new StringBuilder(128); sb.Append(Constants.LeftAngleBracketStr); var values = val._values; var structs = val._structs; if (structs == null) { sb.Append(values[0]); for (int i = 1, icnt = values.Length; i < icnt; ++i) { sb.Append(Constants.MediumVerticalBarPadded).Append(values[i]); } sb.Append(Constants.RightAngleBracketStr); return(sb.ToString()); } if (values[0] == null) { sb.Append(MergeValues(structs[0])); } else { sb.Append(values[0]); } for (int i = 1, icnt = values.Length; i < icnt; ++i) { sb.Append(Constants.MediumVerticalBarPadded); if (values[i] == null) { sb.Append(MergeValues(structs[i])); } else { sb.Append(values[i]); } } sb.Append(Constants.RightAngleBracketStr); return(sb.ToString()); }
public static string StructString(StructFieldsEx structFld, ClrHeap heap, ulong addr) { StructValueStrings val = GetStructValueStrings(structFld, heap, addr); return(StructValueStrings.MergeValues(val)); }
GetClassValueStrings(ClrHeap heap, ulong addr) { try { addr = Utils.RealAddress(addr); (ClrType type, ClrElementKind kind, ClrType rtype, ClrElementKind rkind) = TypeExtractor.GetRealType(heap, addr); if (type == null) { return("Object Value Error" + Constants.HeavyGreekCrossPadded + "Cannot find an instance." + Constants.HeavyGreekCrossPadded + "Heap cannot get object type at address: " + Utils.RealAddressString(addr), null, ClrElementKind.Unknown, (null, null, null, null)); } var fldCnt = type.Fields.Count; var fldTypes = fldCnt == 0 ? Utils.EmptyArray <ClrType> .Value : new ClrType[fldCnt]; var fldKinds = fldCnt == 0 ? Utils.EmptyArray <ClrElementKind> .Value : new ClrElementKind[fldCnt]; var strings = fldCnt == 0 ? Utils.EmptyArray <string> .Value : new string[fldCnt]; StructValueStrings[] structVals = null; for (int i = 0; i < fldCnt; ++i) { var fld = type.Fields[i]; var fldType = fld.Type; // returns ClrElementKind.Unknown if fld.Type is null fldTypes[i] = fldType; var fldKind = TypeExtractor.GetElementKind(fldType); fldKinds[i] = fldKind; if (fldKind == ClrElementKind.Unknown) { strings[i] = Constants.UnknownValue; continue; // nothing to do here, from MDR lib: There is // a bug in several versions of our debugging layer which causes this. } if (TypeExtractor.IsAmbiguousKind(fldKind)) { (ClrType aType, ClrElementKind aKind) = TypeExtractor.GetReferenceFieldRealTypeAndKind(heap, addr, fld); if (aType != null) { fldType = aType; fldTypes[i] = fldType; fldKind = aKind; fldKinds[i] = fldKind; } } if (TypeExtractor.IsString(fldKind)) { var o = fld.GetValue(addr, false, true); strings[i] = o == null ? Constants.NullValue : o.ToString(); } else if (TypeExtractor.IsObjectReference(fldKind)) { var obj = fld.GetValue(addr, false, false); strings[i] = obj == null ? Constants.InvalidAddressStr : Utils.RealAddressString((ulong)obj); } else if (TypeExtractor.IsEnum(fldKind)) { strings[i] = ValueExtractor.GetEnumString(addr, fld, false); } else if (fldType.IsPrimitive) { strings[i] = ValueExtractor.PrimitiveValue(addr, fld, false); } else if (TypeExtractor.IsKnownStruct(fldKind)) { switch (TypeExtractor.GetSpecialKind(fldKind)) { case ClrElementKind.DateTime: strings[i] = ValueExtractor.GetDateTimeString(addr, fld, false); break; case ClrElementKind.Guid: strings[i] = ValueExtractor.GuidValueAsString(addr, fldType, false); break; case ClrElementKind.Decimal: strings[i] = ValueExtractor.DecimalStringPAF(addr, fld, false); break; case ClrElementKind.TimeSpan: strings[i] = ValueExtractor.TimeSpanValueAsString(addr, fldType); break; } } else if (TypeExtractor.IsUnknownStruct(fldKind)) { StructFields sf = StructFields.GetStructFields(fldType); StructFieldsEx sfx = StructFieldsEx.GetStructFields(sf, fldType); sfx.ResetTypes(); if (structVals == null) { structVals = new StructValueStrings[fldCnt]; } ulong structAddr = fld.GetAddress(addr, false); structVals[i] = StructFieldsEx.GetStructValueStrings(sfx, heap, structAddr); } } //if (!Utils.SameStrings(fld.Type.Name,fldType.Name)) // { // ulong fldAddr = fld.GetAddress(addr, type.IsValueClass); // if (TypeExtractor.IsString(fldKind)) // { // var obj = ValueExtractor.GetStringValue(fldType, fldAddr); // strings[i] = obj == null ? Constants.NullValue : (string)obj; // } // else if (TypeExtractor.IsObjectReference(fldKind)) // { // var obj = fld.GetValue(addr, false, false); // strings[i] = obj == null ? Constants.InvalidAddressStr : Utils.RealAddressString((ulong)obj); // } // else if (TypeExtractor.IsEnum(fldKind)) // { // long intVal; // strings[i] = ValueExtractor.GetEnumValueString(fldAddr, fldType, out intVal); // } // else if (fldType.IsPrimitive) // { // var obj = fld.Type.GetValue(fldAddr); // strings[i] = ValueExtractor.PrimitiveValue(obj, fldKind); // } // else if (TypeExtractor.IsKnownStruct(fldKind)) // { // switch (TypeExtractor.GetSpecialKind(fldKind)) // { // case ClrElementKind.DateTime: // strings[i] = ValueExtractor.DateTimeValueString(fldAddr, fldType, null); // break; // case ClrElementKind.Guid: // strings[i] = ValueExtractor.GuidValueAsString(fldAddr, fldType); // break; // case ClrElementKind.Decimal: // strings[i] = ValueExtractor.DecimalValueAsString(fldAddr, fldType,null); // break; // case ClrElementKind.TimeSpan: // strings[i] = ValueExtractor.TimeSpanValueAsString(fldAddr, fldType); // break; // } // } // else if (TypeExtractor.IsUnknownStruct(fldKind)) // { // StructFields sf = StructFields.GetStructFields(fldType); // StructFieldsEx sfx = StructFieldsEx.GetStructFields(sf, fldType); // sfx.ResetTypes(); // if (structVals == null) structVals = new StructValueStrings[fldCnt]; // ulong structAddr = fld.GetAddress(addr, false); // structVals[i] = StructFieldsEx.GetStructValueStrings(sfx, heap, structAddr); // } // continue; return(null, type, kind, (fldTypes, fldKinds, strings, structVals)); } catch (Exception ex) { return(Utils.GetExceptionErrorString(ex), null, ClrElementKind.Unknown, (null, null, null, null)); } }