|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
namespace Microsoft.Diagnostics.DataContractReader.Contracts;
internal readonly struct Exception_1 : IException
{
private readonly Target _target;
internal Exception_1(Target target)
{
_target = target;
}
TargetPointer IException.GetNestedExceptionInfo(TargetPointer exceptionInfoAddr, out TargetPointer nextNestedExceptionInfo, out TargetPointer thrownObjectHandle)
{
Data.ExceptionInfo exceptionInfo = _target.ProcessedData.GetOrAdd<Data.ExceptionInfo>(exceptionInfoAddr);
nextNestedExceptionInfo = exceptionInfo.PreviousNestedInfo;
// ThrownObject is a direct object pointer stored in ExInfo::m_exception.
// Return the address of the field as a "handle" - reading through it yields the
// exception Object*. This has the same lifetime as the ExInfo (both are invalidated
// when PopExInfos calls ReleaseResources). See dacimpl.h for the equivalent native
// DAC documentation.
Target.TypeInfo type = _target.GetTypeInfo(DataType.ExceptionInfo);
thrownObjectHandle = exceptionInfoAddr + (ulong)type.Fields[nameof(Data.ExceptionInfo.ThrownObject)].Offset;
return exceptionInfo.ThrownObject;
}
ExceptionData IException.GetExceptionData(TargetPointer exceptionAddr)
{
Data.Exception exception = _target.ProcessedData.GetOrAdd<Data.Exception>(exceptionAddr);
return new ExceptionData(
exception.Message,
exception.InnerException,
exception.StackTrace,
exception.WatsonBuckets,
exception.StackTraceString,
exception.RemoteStackTraceString,
exception.HResult,
exception.XCode);
}
}
|