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); } } }
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)); }
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)); }
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)); }
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); } } }
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; }
public ThisValueLocation(DmdType type, ILDbgEngineStackFrame frame) { Type = type ?? throw new ArgumentNullException(nameof(type)); this.frame = frame ?? throw new ArgumentNullException(nameof(frame)); }
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);
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); } } }
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)); }