Example #1
0
        private string InternalGetValue(int indentLevel, int expandDepth, bool canDoFunceval)
        {
            Debug.Assert(expandDepth >= 0);

            CorValue value = this.CorValue;

            if (value == null)
            {
                return("<N/A>");
            }

            // Record the memory addresses if displaying them is enabled
            string        prefix        = String.Empty;
            StringBuilder ptrStrBuilder = null;

            if (m_process.m_engine.Options.ShowAddresses)
            {
                ptrStrBuilder = new StringBuilder();
            }

            try
            {
                value = Dereference(value, ptrStrBuilder);
            }
            catch (COMException ce)
            {
                if (ce.ErrorCode == (int)HResult.CORDBG_E_BAD_REFERENCE_VALUE)
                {
                    return(MakePrefixFromPtrStringBuilder(ptrStrBuilder) + "<invalid reference value>");
                }
                throw;
            }

            prefix = MakePrefixFromPtrStringBuilder(ptrStrBuilder);

            if (value == null)
            {
                return(prefix + "<null>");
            }

            Unbox(ref value);

            switch (value.Type)
            {
            case CorElementType.ELEMENT_TYPE_BOOLEAN:
            case CorElementType.ELEMENT_TYPE_I1:
            case CorElementType.ELEMENT_TYPE_U1:
            case CorElementType.ELEMENT_TYPE_I2:
            case CorElementType.ELEMENT_TYPE_U2:
            case CorElementType.ELEMENT_TYPE_I4:
            case CorElementType.ELEMENT_TYPE_U4:
            case CorElementType.ELEMENT_TYPE_I:
            case CorElementType.ELEMENT_TYPE_U:
            case CorElementType.ELEMENT_TYPE_I8:
            case CorElementType.ELEMENT_TYPE_U8:
            case CorElementType.ELEMENT_TYPE_R4:
            case CorElementType.ELEMENT_TYPE_R8:
            case CorElementType.ELEMENT_TYPE_CHAR:
            {
                object v = value.CastToGenericValue().GetValue();
                string result;

                IFormattable vFormattable = v as IFormattable;
                if (vFormattable != null)
                {
                    result = vFormattable.ToString(null, System.Globalization.CultureInfo.CurrentUICulture);
                }
                else
                {
                    result = v.ToString();
                }

                // let's put quotes around char values
                if (value.Type == CorElementType.ELEMENT_TYPE_CHAR)
                {
                    result = "'" + result + "'";
                }

                return(prefix + result);
            }

            case CorElementType.ELEMENT_TYPE_CLASS:
            case CorElementType.ELEMENT_TYPE_VALUETYPE:
                CorObjectValue ov = value.CastToObjectValue();
                return(prefix + PrintObject(indentLevel, ov, expandDepth, canDoFunceval));

            case CorElementType.ELEMENT_TYPE_STRING:
                CorStringValue sv = value.CastToStringValue();
                return(prefix + '"' + sv.String + '"');

            case CorElementType.ELEMENT_TYPE_SZARRAY:
            case CorElementType.ELEMENT_TYPE_ARRAY:
                CorArrayValue av = value.CastToArrayValue();
                return(prefix + PrintArray(indentLevel, av, expandDepth, canDoFunceval));

            case CorElementType.ELEMENT_TYPE_PTR:
                return(prefix + "<non-null pointer>");

            case CorElementType.ELEMENT_TYPE_FNPTR:
                return(prefix + "0x" + value.CastToReferenceValue().Value.ToString("X"));

            case CorElementType.ELEMENT_TYPE_BYREF:
            case CorElementType.ELEMENT_TYPE_TYPEDBYREF:
            case CorElementType.ELEMENT_TYPE_OBJECT:
            default:
                return(prefix + "<printing value of type: " + value.Type + " not implemented>");
            }
        }
Example #2
0
        public static CorValue GetRealObject(EvaluationContext ctx, CorValue obj)
        {
            CorEvaluationContext cctx = (CorEvaluationContext)ctx;

            if (obj == null)
            {
                return(null);
            }

            try {
                if (obj is CorStringValue)
                {
                    return(obj);
                }

                if (obj is CorGenericValue)
                {
                    return(obj);
                }

                if (obj is CorGenericValue)
                {
                    return(obj);
                }

                if (obj is CorArrayValue)
                {
                    return(obj);
                }

                CorArrayValue arrayVal = obj.CastToArrayValue();
                if (arrayVal != null)
                {
                    return(arrayVal);
                }

                CorReferenceValue refVal = obj.CastToReferenceValue();
                if (refVal != null)
                {
                    if (refVal.IsNull)
                    {
                        return(refVal);
                    }
                    else
                    {
                        cctx.Session.WaitUntilStopped();
                        return(GetRealObject(cctx, refVal.Dereference()));
                    }
                }

                cctx.Session.WaitUntilStopped();
                CorBoxValue boxVal = obj.CastToBoxValue();
                if (boxVal != null)
                {
                    return(Unbox(ctx, boxVal));
                }

                if (obj.ExactType.Type == CorElementType.ELEMENT_TYPE_STRING)
                {
                    return(obj.CastToStringValue());
                }

                if (CorMetadataImport.CoreTypes.ContainsKey(obj.Type))
                {
                    CorGenericValue genVal = obj.CastToGenericValue();
                    if (genVal != null)
                    {
                        return(genVal);
                    }
                }

                if (!(obj is CorObjectValue))
                {
                    return(obj.CastToObjectValue());
                }
            }
            catch {
                // Ignore
                throw;
            }
            return(obj);
        }
Example #3
0
        private string InternalGetValue(int indentLevel, int expandDepth, bool canDoFunceval, string variableName, Dictionary <string, int> variablesToLog)
        {
            Debug.Assert(expandDepth >= 0);

            CorValue value = this.CorValue;

            if (value == null)
            {
                return("<N/A>");
            }

            // Record the memory addresses if displaying them is enabled
            string        prefix        = String.Empty;
            StringBuilder ptrStrBuilder = null;

            if (m_process.m_engine.Options.ShowAddresses)
            {
                ptrStrBuilder = new StringBuilder();
            }

            try
            {
                value = Dereference(value, ptrStrBuilder);
            }
            catch (COMException ce)
            {
                if (ce.ErrorCode == (int)HResult.CORDBG_E_BAD_REFERENCE_VALUE)
                {
                    return(MakePrefixFromPtrStringBuilder(ptrStrBuilder) + "<invalid reference value>");
                }
                throw;
            }

            prefix = MakePrefixFromPtrStringBuilder(ptrStrBuilder);

            if (value == null)
            {
                return(prefix + "<null>");
            }

            Unbox(ref value);

            switch (value.Type)
            {
            case CorElementType.ELEMENT_TYPE_BOOLEAN:
            case CorElementType.ELEMENT_TYPE_I1:
            case CorElementType.ELEMENT_TYPE_U1:
            case CorElementType.ELEMENT_TYPE_I2:
            case CorElementType.ELEMENT_TYPE_U2:
            case CorElementType.ELEMENT_TYPE_I4:
            case CorElementType.ELEMENT_TYPE_U4:
            case CorElementType.ELEMENT_TYPE_I:
            case CorElementType.ELEMENT_TYPE_U:
            case CorElementType.ELEMENT_TYPE_I8:
            case CorElementType.ELEMENT_TYPE_U8:
            case CorElementType.ELEMENT_TYPE_R4:
            case CorElementType.ELEMENT_TYPE_R8:
            case CorElementType.ELEMENT_TYPE_CHAR:
            {
                if (variablesToLog == null)
                {
                }
                else if (!variablesToLog.Any(variable => variable.Key == variableName))
                {
                    return("[SKIP]");
                }

                object v = value.CastToGenericValue().GetValue();
                string result;

                IFormattable vFormattable = v as IFormattable;
                if (vFormattable != null)
                {
                    result = vFormattable.ToString(null, System.Globalization.CultureInfo.CurrentUICulture);
                }
                else
                {
                    result = v.ToString();
                }

                // let's put quotes around char values
                if (value.Type == CorElementType.ELEMENT_TYPE_CHAR)
                {
                    result = "'" + result + "'";
                }

                return(Loger.WriteThisToLog(variableName, prefix + result));
            }

            case CorElementType.ELEMENT_TYPE_CLASS:
            case CorElementType.ELEMENT_TYPE_VALUETYPE:
                CorObjectValue ov           = value.CastToObjectValue();
                var            objectString = PrintObject(indentLevel, ov, expandDepth, canDoFunceval, variableName, variablesToLog);
                string         objectPrint;

                if (objectString == "[SKIP]")
                {
                    objectPrint = "[SKIP]";
                }
                else
                {
                    objectPrint = prefix + objectString;
                    Loger.WriteThisToLog(variableName, objectPrint.Substring(0, objectPrint.IndexOf('\n') > -1 ? objectPrint.IndexOf('\n') : objectPrint.Length));
                }

                return(objectPrint);

            case CorElementType.ELEMENT_TYPE_STRING:
                if (variablesToLog == null)
                {
                }
                else if (!variablesToLog.Any(variable => variable.Key == variableName))
                {
                    return("[SKIP]");
                }
                CorStringValue sv = value.CastToStringValue();
                return(Loger.WriteThisToLog(variableName, $"{prefix}\"{sv.String}\""));

            case CorElementType.ELEMENT_TYPE_SZARRAY:
            case CorElementType.ELEMENT_TYPE_ARRAY:
                CorArrayValue av          = value.CastToArrayValue();
                var           arrayString = PrintArray(indentLevel, av, expandDepth, canDoFunceval, variableName, variablesToLog);
                string        arrayPrint;
                if (arrayString == "[SKIP]")
                {
                    arrayPrint = "[SKIP]";
                }
                else
                {
                    arrayPrint = prefix + arrayString;
                    Loger.WriteThisToLog(variableName, arrayPrint.Substring(0, arrayPrint.IndexOf('\n') > -1 ? arrayPrint.IndexOf('\n') : arrayPrint.Length));
                }
                return(arrayPrint);

            case CorElementType.ELEMENT_TYPE_PTR:
                return(Loger.WriteThisToLog(variableName, prefix + "<non-null pointer>"));;

            case CorElementType.ELEMENT_TYPE_FNPTR:
                return(Loger.WriteThisToLog(variableName, prefix + "0x" + value.CastToReferenceValue().Value.ToString("X")));

            case CorElementType.ELEMENT_TYPE_BYREF:
            case CorElementType.ELEMENT_TYPE_TYPEDBYREF:
            case CorElementType.ELEMENT_TYPE_OBJECT:
            default:
                return(Loger.WriteThisToLog(variableName, prefix + "<printing value of type: " + value.Type + " not implemented>"));
            }
        }