internal DbgDotNetValue CreateDotNetValue_CorDebug(CorValue value, DmdAppDomain reflectionAppDomain, bool tryCreateStrongHandle, bool closeOnContinue = true)
        {
            debuggerThread.VerifyAccess();
            if (value is null)
            {
                return(new SyntheticValue(reflectionAppDomain.System_Void, new DbgDotNetRawValue(DbgSimpleValueType.Void)));
            }

            try {
                var type = new ReflectionTypeCreator(this, reflectionAppDomain).Create(value.ExactType);

                if (tryCreateStrongHandle && !value.IsNull && !value.IsHandle && value.IsReference && !type.IsPointer && !type.IsFunctionPointer && !type.IsByRef)
                {
                    var derefValue   = value.GetDereferencedValue(out int hr);
                    var strongHandle = derefValue?.CreateHandle(CorDebugHandleType.HANDLE_STRONG);
                    Debug2.Assert(derefValue is null || !(strongHandle is null) || type == type.AppDomain.System_TypedReference);
                    if (!(strongHandle is null))
                    {
                        value = strongHandle;
                    }
                }

                var dnValue = new DbgDotNetValueImpl(this, new DbgCorValueHolder(this, value, type));
                if (closeOnContinue)
                {
                    lock (lockObj)
                        dotNetValuesToCloseOnContinue.Add(dnValue);
                }
                return(dnValue);
            }
            catch {
                dnDebugger.DisposeHandle(value);
                throw;
            }
        }
Beispiel #2
0
        internal string StoreValue_CorDebug(DbgEvaluationContext context, DbgThread thread, ILDbgEngineStackFrame ilFrame, Func <CreateCorValueResult> createTargetValue, DmdType targetType, object sourceValue, 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>();
            CreateCorValueResult createResult = default;

            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(sourceValue, targetType, out var newValueType);
                    if (evalRes.ErrorMessage != null)
                    {
                        return(evalRes.ErrorMessage);
                    }

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

                    createResult = createTargetValue();
                    if (createResult.Value == null)
                    {
                        return(CordbgErrorHelper.GetErrorMessage(createResult.HResult));
                    }
                    return(StoreValue_CorDegbug(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);
                }
            }
        }
Beispiel #3
0
        string TryGetExceptionName(CorValue exObj)
        {
            var corType = exObj?.ExactType;
            var module  = TryGetModule(corType?.Class?.Module);

            if (module == null)
            {
                return(null);
            }
            var type = new ReflectionTypeCreator(this, module.GetReflectionModule().AppDomain).Create(corType);

            if (type.IsConstructedGenericType)
            {
                type = type.GetGenericTypeDefinition();
            }
            return(type.FullName);
        }