コード例 #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));
        }
コード例 #2
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));
        }
コード例 #3
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));
        }
コード例 #4
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));
        }
コード例 #5
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);
        }
コード例 #6
0
        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);
            }
        }