Esempio n. 1
0
        string SetArrayElementAt_CorDebug(DbgEvaluationContext context, DbgStackFrame frame, uint index, object value, CancellationToken cancellationToken)
        {
            engine.VerifyCorDebugThread();
            cancellationToken.ThrowIfCancellationRequested();
            if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame))
            {
                return(CordbgErrorHelper.InternalError);
            }
            Func <CreateCorValueResult> createTargetValue = () => {
                var corValue = TryGetCorValue();
                if (corValue == null || corValue.IsNull)
                {
                    return(new CreateCorValueResult(null, -1));
                }
                using (var obj = new ArrayObjectValue(engine, corValue)) {
                    if (obj.Value == null)
                    {
                        return(new CreateCorValueResult(null, -1));
                    }
                    var elemValue = obj.Value.GetElementAtPosition(index, out int hr);
                    return(new CreateCorValueResult(elemValue, hr));
                }
            };

            return(engine.StoreValue_CorDebug(context, frame.Thread, ilFrame, createTargetValue, Type.GetElementType(), value, cancellationToken));
        }
        string?StoreSimpleValue_CorDebug(DbgEvaluationInfo evalInfo, ILDbgEngineStackFrame ilFrame, Func <CreateCorValueResult> createTargetValue, DmdType targetType, object?sourceValue)
        {
            Debug.Assert(RequiresNoFuncEvalToStoreValue(targetType, sourceValue));
            evalInfo.CancellationToken.ThrowIfCancellationRequested();
            CreateCorValueResult createResult = default;

            try {
                var dnThread = GetThread(evalInfo.Frame.Thread);
                createResult = createTargetValue();
                if (createResult.Value is null)
                {
                    return(CordbgErrorHelper.GetErrorMessage(createResult.HResult));
                }
                return(StoreSimpleValue_CorDebug(dnThread, createResult.Value, targetType, sourceValue));
            }
            catch (TimeoutException) {
                return(PredefinedEvaluationErrorMessages.FuncEvalTimedOut);
            }
            catch (Exception ex) when(ExceptionUtils.IsInternalDebuggerError(ex))
            {
                return(CordbgErrorHelper.InternalError);
            }
            finally {
                if (createResult.CanDispose)
                {
                    dnDebugger.DisposeHandle(createResult.Value);
                }
            }
        }
Esempio n. 3
0
        DbgDotNetValueResult?Box_CorDebug(DbgEvaluationInfo evalInfo)
        {
            engine.VerifyCorDebugThread();
            evalInfo.CancellationToken.ThrowIfCancellationRequested();
            var corValue = TryGetCorValue();

            if (corValue == null)
            {
                return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.InternalError));
            }
            if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(evalInfo.Frame, out var ilFrame))
            {
                return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.InternalError));
            }
            // Even if it's boxed, box the unboxed value. This code path should only be called if
            // the compiler thinks it's an unboxed value, so we must make a new boxed value.
            if (corValue.IsReference)
            {
                corValue = corValue.GetDereferencedValue(out int hr);
                if (corValue == null)
                {
                    return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.GetErrorMessage(hr)));
                }
            }
            if (corValue.IsBox)
            {
                corValue = corValue.GetBoxedValue(out int hr);
                if (corValue == null)
                {
                    return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.GetErrorMessage(hr)));
                }
            }
            return(engine.Box_CorDebug(evalInfo, ilFrame.GetCorAppDomain(), corValue, Type));
        }
        internal string?SetParameterValue_CorDebug(DbgEvaluationInfo evalInfo, ILDbgEngineStackFrame ilFrame, uint index, DmdType targetType, object?value)
        {
            Func <CreateCorValueResult> createTargetValue = () => {
                var corValue = ilFrame.CorFrame.GetILArgument(index, out int hr);
                return(new CreateCorValueResult(corValue, hr));
            };

            return(StoreValue_CorDebug(evalInfo, ilFrame, createTargetValue, targetType, value));
        }
        bool TryGetNativeCodeCore(ILDbgEngineStackFrame ilFrame, out DbgDotNetNativeCode nativeCode)
        {
            Dispatcher.VerifyAccess();
            if (!engine.IsPaused)
            {
                nativeCode = default;
                return(false);
            }
            var code = ilFrame.CorFrame.Code;

            ilFrame.GetFrameMethodInfo(out var module, out var methodMetadataToken, out var genericTypeArguments, out var genericMethodArguments);
            var reflectionMethod = TryGetMethod(module, methodMetadataToken, genericTypeArguments, genericMethodArguments);

            return(TryGetNativeCodeCore(code, reflectionMethod, out nativeCode));
        }
Esempio n. 6
0
        string StoreIndirect_CorDebug(DbgEvaluationContext context, DbgStackFrame frame, object value, CancellationToken cancellationToken)
        {
            engine.VerifyCorDebugThread();
            cancellationToken.ThrowIfCancellationRequested();
            if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame))
            {
                return(CordbgErrorHelper.InternalError);
            }
            if (!Type.IsByRef)
            {
                return(CordbgErrorHelper.InternalError);
            }
            Func <CreateCorValueResult> createTargetValue = () => {
                var objValue = TryGetCorValue();
                if (objValue == null)
                {
                    return(new CreateCorValueResult(null, -1));
                }
                Debug.Assert(objValue.ElementType == CorElementType.ByRef);
                if (objValue.ElementType == CorElementType.ByRef)
                {
                    var derefencedValue = objValue.DereferencedValue;
                    if (derefencedValue == null)
                    {
                        return(new CreateCorValueResult(null, -1));
                    }
                    if (!derefencedValue.IsReference)
                    {
                        if (derefencedValue.IsGeneric)
                        {
                            return(new CreateCorValueResult(derefencedValue, 0, canDispose: true));
                        }
                        engine.DisposeHandle_CorDebug(derefencedValue);
                        return(new CreateCorValueResult(null, -1));
                    }
                    return(new CreateCorValueResult(derefencedValue, 0, canDispose: true));
                }
                else
                {
                    return(new CreateCorValueResult(null, -1));
                }
            };

            return(engine.StoreValue_CorDebug(context, frame.Thread, ilFrame, createTargetValue, Type.GetElementType(), value, cancellationToken));
        }
Esempio n. 7
0
        string?StoreIndirect_CorDebug(DbgEvaluationInfo evalInfo, object?value)
        {
            engine.VerifyCorDebugThread();
            evalInfo.CancellationToken.ThrowIfCancellationRequested();
            if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(evalInfo.Frame, out var ilFrame))
            {
                return(CordbgErrorHelper.InternalError);
            }
            if (!Type.IsByRef && !Type.IsPointer)
            {
                return(CordbgErrorHelper.InternalError);
            }
            Func <CreateCorValueResult> createTargetValue = () => {
                var objValue = TryGetCorValue();
                if (objValue is null)
                {
                    return(new CreateCorValueResult(null, -1));
                }
                Debug.Assert(objValue.ElementType == CorElementType.ByRef || objValue.ElementType == CorElementType.Ptr);
                if (objValue.ElementType == CorElementType.ByRef || objValue.ElementType == CorElementType.Ptr)
                {
                    var derefencedValue = objValue.GetDereferencedValue(out int hr);
                    if (derefencedValue is null)
                    {
                        return(new CreateCorValueResult(null, hr));
                    }
                    if (!derefencedValue.IsReference)
                    {
                        if (derefencedValue.IsGeneric)
                        {
                            return(new CreateCorValueResult(derefencedValue, 0, canDispose: true));
                        }
                        engine.DisposeHandle_CorDebug(derefencedValue);
                        return(new CreateCorValueResult(null, -1));
                    }
                    return(new CreateCorValueResult(derefencedValue, 0, canDispose: true));
                }
                else
                {
                    return(new CreateCorValueResult(null, -1));
                }
            };

            return(engine.StoreValue_CorDebug(evalInfo, ilFrame, createTargetValue, Type.GetElementType() !, value));
        }
Esempio n. 8
0
        DbgDotNetValue Box_CorDebug(DbgEvaluationContext context, DbgStackFrame frame, CancellationToken cancellationToken)
        {
            engine.VerifyCorDebugThread();
            cancellationToken.ThrowIfCancellationRequested();
            var corValue = TryGetCorValue();

            if (corValue == null)
            {
                return(null);
            }
            if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame))
            {
                return(null);
            }
            // Even if it's boxed, box the unboxed value. This code path should only be called if
            // the compiler thinks it's an unboxed value, so we must make a new boxed value.
            if (corValue.IsReference)
            {
                corValue = corValue.DereferencedValue;
                if (corValue == null)
                {
                    return(null);
                }
            }
            if (corValue.IsBox)
            {
                corValue = corValue.BoxedValue;
                if (corValue == null)
                {
                    return(null);
                }
            }
            var res = engine.Box_CorDebug(context, frame.Thread, ilFrame.GetCorAppDomain(), corValue, Type, cancellationToken);

            if (res.IsNormalResult)
            {
                return(res.Value);
            }
            res.Value?.Dispose();
            return(null);
        }
        public bool TryGetNativeCode(DbgStackFrame frame, out DbgDotNetNativeCode nativeCode)
        {
            if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame))
            {
                nativeCode = default;
                return(false);
            }
            if (Dispatcher.CheckAccess())
            {
                return(TryGetNativeCodeCore(ilFrame, out nativeCode));
            }
            return(TryGetNativeCode2(ilFrame, out nativeCode));

            bool TryGetNativeCode2(ILDbgEngineStackFrame ilFrame2, out DbgDotNetNativeCode nativeCode2)
            {
                DbgDotNetNativeCode nativeCodeTmp = default;
                bool res = Dispatcher.InvokeRethrow(() => TryGetNativeCodeCore(ilFrame2, out nativeCodeTmp));

                nativeCode2 = nativeCodeTmp;
                return(res);
            }
        }
        internal string?StoreValue_CorDebug(DbgEvaluationInfo evalInfo, ILDbgEngineStackFrame ilFrame, Func <CreateCorValueResult> createTargetValue, DmdType targetType, object?sourceValue)
        {
            debuggerThread.VerifyAccess();

            if (RequiresNoFuncEvalToStoreValue(targetType, sourceValue))
            {
                return(StoreSimpleValue_CorDebug(evalInfo, ilFrame, createTargetValue, targetType, sourceValue));
            }

            evalInfo.CancellationToken.ThrowIfCancellationRequested();
            var tmp = CheckFuncEval(evalInfo);

            if (!(tmp is null))
            {
                return(tmp.Value.ErrorMessage ?? throw new InvalidOperationException());
            }

            var dnThread      = GetThread(evalInfo.Frame.Thread);
            var createdValues = new List <CorValue>();
            CreateCorValueResult createResult = default;

            try {
                var appDomain           = ilFrame.GetCorAppDomain();
                var reflectionAppDomain = targetType.AppDomain;
                using (var dnEval = dnDebugger.CreateEval(evalInfo.CancellationToken, suspendOtherThreads: (evalInfo.Context.Options & DbgEvaluationContextOptions.RunAllThreads) == 0)) {
                    dnEval.SetThread(dnThread);
                    dnEval.SetTimeout(evalInfo.Context.FuncEvalTimeout);
                    dnEval.EvalEvent += (s, e) => DnEval_EvalEvent(dnEval, evalInfo);

                    var converter = new EvalArgumentConverter(this, dnEval, appDomain, reflectionAppDomain, createdValues);

                    var evalRes = converter.Convert(sourceValue, targetType, out var newValueType);
                    if (!(evalRes.ErrorMessage is null))
                    {
                        return(evalRes.ErrorMessage);
                    }

                    var sourceCorValue = evalRes.CorValue !;
                    var sourceType     = new ReflectionTypeCreator(this, reflectionAppDomain).Create(sourceCorValue.ExactType);

                    createResult = createTargetValue();
                    if (createResult.Value is null)
                    {
                        return(CordbgErrorHelper.GetErrorMessage(createResult.HResult));
                    }
                    return(StoreValue_CorDebug(dnEval, createdValues, appDomain, dnThread, createResult.Value, targetType, sourceCorValue, sourceType));
                }
            }
            catch (TimeoutException) {
                return(PredefinedEvaluationErrorMessages.FuncEvalTimedOut);
            }
            catch (Exception ex) when(ExceptionUtils.IsInternalDebuggerError(ex))
            {
                return(CordbgErrorHelper.InternalError);
            }
            finally {
                if (createResult.CanDispose)
                {
                    dnDebugger.DisposeHandle(createResult.Value);
                }
                foreach (var v in createdValues)
                {
                    dnDebugger.DisposeHandle(v);
                }
            }
        }
Esempio n. 11
0
 public LocalValueLocation(DmdType type, ILDbgEngineStackFrame frame, int index)
 {
     Type       = type ?? throw new ArgumentNullException(nameof(type));
     this.frame = frame ?? throw new ArgumentNullException(nameof(frame));
     this.index = index;
 }
Esempio n. 12
0
 public ThisValueLocation(DmdType type, ILDbgEngineStackFrame frame)
 {
     Type       = type ?? throw new ArgumentNullException(nameof(type));
     this.frame = frame ?? throw new ArgumentNullException(nameof(frame));
 }
Esempio n. 13
0
 internal string SetParameterValue_CorDebug(DbgEvaluationContext context, DbgThread thread, ILDbgEngineStackFrame ilFrame, uint index, DmdType targetType, object value, CancellationToken cancellationToken) =>
 SetLocalOrParameterValue_CorDebug(context, thread, ilFrame, index, targetType, value, isLocal: false, cancellationToken: cancellationToken);
Esempio n. 14
0
        string SetLocalOrParameterValue_CorDebug(DbgEvaluationContext context, DbgThread thread, ILDbgEngineStackFrame ilFrame, uint index, DmdType targetType, object value, bool isLocal, CancellationToken cancellationToken)
        {
            debuggerThread.VerifyAccess();
            cancellationToken.ThrowIfCancellationRequested();
            var tmp = CheckFuncEval(context);

            if (tmp != null)
            {
                return(tmp.Value.ErrorMessage ?? throw new InvalidOperationException());
            }

            var      dnThread      = GetThread(thread);
            var      createdValues = new List <CorValue>();
            CorValue targetValue   = null;

            try {
                var appDomain           = ilFrame.GetCorAppDomain();
                var reflectionAppDomain = thread.AppDomain.GetReflectionAppDomain() ?? throw new InvalidOperationException();
                using (var dnEval = dnDebugger.CreateEval(cancellationToken, suspendOtherThreads: (context.Options & DbgEvaluationContextOptions.RunAllThreads) == 0)) {
                    dnEval.SetThread(dnThread);
                    dnEval.SetTimeout(context.FuncEvalTimeout);
                    dnEval.EvalEvent += (s, e) => DnEval_EvalEvent(dnEval, context);

                    var converter = new EvalArgumentConverter(this, dnEval, appDomain, reflectionAppDomain, createdValues);

                    var evalRes = converter.Convert(value, targetType, out var newValueType);
                    if (evalRes.ErrorMessage != null)
                    {
                        return(evalRes.ErrorMessage);
                    }

                    targetValue = isLocal ? ilFrame.CorFrame.GetILLocal(index, out int hr) : ilFrame.CorFrame.GetILArgument(index, out hr);
                    if (targetValue == null)
                    {
                        return(CordbgErrorHelper.GetErrorMessage(hr));
                    }

                    var sourceValue = evalRes.CorValue;
                    var sourceType  = new ReflectionTypeCreator(this, reflectionAppDomain).Create(sourceValue.ExactType);

                    return(StoreValue_CorDegbug(dnEval, createdValues, appDomain, dnThread, targetValue, targetType, sourceValue, sourceType));
                }
            }
            catch (TimeoutException) {
                return(PredefinedEvaluationErrorMessages.FuncEvalTimedOut);
            }
            catch (Exception ex) when(ExceptionUtils.IsInternalDebuggerError(ex))
            {
                return(CordbgErrorHelper.InternalError);
            }
            finally {
                dnDebugger.DisposeHandle(targetValue);
                foreach (var v in createdValues)
                {
                    dnDebugger.DisposeHandle(v);
                }
            }
        }
Esempio n. 15
0
        internal DbgDotNetCreateValueResult CreateValue_CorDebug(DbgEvaluationContext context, DbgThread thread, ILDbgEngineStackFrame ilFrame, object value, CancellationToken cancellationToken)
        {
            debuggerThread.VerifyAccess();
            cancellationToken.ThrowIfCancellationRequested();
            var tmp = CheckFuncEval(context);

            if (tmp != null)
            {
                return(new DbgDotNetCreateValueResult(tmp.Value.ErrorMessage ?? throw new InvalidOperationException()));
            }

            var      dnThread        = GetThread(thread);
            var      createdValues   = new List <CorValue>();
            CorValue createdCorValue = null;

            try {
                var appDomain           = ilFrame.GetCorAppDomain();
                var reflectionAppDomain = thread.AppDomain.GetReflectionAppDomain() ?? throw new InvalidOperationException();
                using (var dnEval = dnDebugger.CreateEval(cancellationToken, suspendOtherThreads: (context.Options & DbgEvaluationContextOptions.RunAllThreads) == 0)) {
                    dnEval.SetThread(dnThread);
                    dnEval.SetTimeout(context.FuncEvalTimeout);
                    dnEval.EvalEvent += (s, e) => DnEval_EvalEvent(dnEval, context);

                    var converter = new EvalArgumentConverter(this, dnEval, appDomain, reflectionAppDomain, createdValues);
                    var evalRes   = converter.Convert(value, reflectionAppDomain.System_Object, out var newValueType);
                    if (evalRes.ErrorMessage != null)
                    {
                        return(new DbgDotNetCreateValueResult(evalRes.ErrorMessage));
                    }

                    var resultValue = CreateDotNetValue_CorDebug(evalRes.CorValue, reflectionAppDomain, tryCreateStrongHandle: true);
                    createdCorValue = evalRes.CorValue;
                    return(new DbgDotNetCreateValueResult(resultValue));
                }
            }
            catch (TimeoutException) {
                return(new DbgDotNetCreateValueResult(PredefinedEvaluationErrorMessages.FuncEvalTimedOut));
            }
            catch (Exception ex) when(ExceptionUtils.IsInternalDebuggerError(ex))
            {
                return(new DbgDotNetCreateValueResult(CordbgErrorHelper.InternalError));
            }
            finally {
                foreach (var v in createdValues)
                {
                    if (createdCorValue != v)
                    {
                        dnDebugger.DisposeHandle(v);
                    }
                }
            }
        }
        internal DbgDotNetValueResult CreateValue_CorDebug(DbgEvaluationInfo evalInfo, ILDbgEngineStackFrame ilFrame, object?value)
        {
            debuggerThread.VerifyAccess();
            evalInfo.CancellationToken.ThrowIfCancellationRequested();
            if (value is DbgDotNetValueImpl)
            {
                return(DbgDotNetValueResult.Create((DbgDotNetValueImpl)value));
            }
            var tmp = CheckFuncEval(evalInfo);

            if (!(tmp is null))
            {
                return(tmp.Value);
            }

            var      dnThread        = GetThread(evalInfo.Frame.Thread);
            var      createdValues   = new List <CorValue>();
            CorValue?createdCorValue = null;

            try {
                var appDomain           = ilFrame.GetCorAppDomain();
                var reflectionAppDomain = ilFrame.GetReflectionModule().AppDomain;
                using (var dnEval = dnDebugger.CreateEval(evalInfo.CancellationToken, suspendOtherThreads: (evalInfo.Context.Options & DbgEvaluationContextOptions.RunAllThreads) == 0)) {
                    dnEval.SetThread(dnThread);
                    dnEval.SetTimeout(evalInfo.Context.FuncEvalTimeout);
                    dnEval.EvalEvent += (s, e) => DnEval_EvalEvent(dnEval, evalInfo);

                    var converter = new EvalArgumentConverter(this, dnEval, appDomain, reflectionAppDomain, createdValues);
                    var evalRes   = converter.Convert(value, reflectionAppDomain.System_Object, out var newValueType);
                    if (!(evalRes.ErrorMessage is null))
                    {
                        return(DbgDotNetValueResult.CreateError(evalRes.ErrorMessage));
                    }

                    var resultValue = CreateDotNetValue_CorDebug(evalRes.CorValue !, reflectionAppDomain, tryCreateStrongHandle: true);
                    createdCorValue = evalRes.CorValue;
                    return(DbgDotNetValueResult.Create(resultValue));
                }
            }
            catch (TimeoutException) {
                return(DbgDotNetValueResult.CreateError(PredefinedEvaluationErrorMessages.FuncEvalTimedOut));
            }
            catch (Exception ex) when(ExceptionUtils.IsInternalDebuggerError(ex))
            {
                return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.InternalError));
            }
            finally {
                foreach (var v in createdValues)
                {
                    if (!v.Equals(createdCorValue))
                    {
                        dnDebugger.DisposeHandle(v);
                    }
                }
            }
        }
        internal string SetParameterValue_CorDebug(DbgEvaluationContext context, DbgThread thread, ILDbgEngineStackFrame ilFrame, uint index, DmdType targetType, object value, CancellationToken cancellationToken)
        {
            Func <CreateCorValueResult> createTargetValue = () => {
                var corValue = ilFrame.CorFrame.GetILArgument(index, out int hr);
                return(new CreateCorValueResult(corValue, hr));
            };

            return(StoreValue_CorDebug(context, thread, ilFrame, createTargetValue, targetType, value, cancellationToken));
        }