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; } }
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); } } }
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); }